wifi_unittest.cc revision b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84e
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be 3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file. 4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi.h" 6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h> 85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h> // Needs typedefs from sys/socket.h. 95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h> 10ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include <netlink/attr.h> 115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 12f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h> 20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h> 22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 26675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_config.h" 27675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_provider.h" 28125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h" 2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 31397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h" 327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 36084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h" 37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 3911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 40e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 41687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 43cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 442ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 453426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 4610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 47af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h" 48a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 4902e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h" 508d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 5102e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h" 528d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h" 538d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h" 5402e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h" 55b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart#include "shill/net/netlink_packet.h" 5602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h" 5702e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h" 58dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h" 61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h" 62da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h" 63da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h" 64da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h" 65da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h" 6685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 67af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h" 69d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h" 70618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu#include "shill/wifi/mock_tdls_manager.h" 71d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h" 72d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h" 73d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h" 74d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h" 75d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h" 76d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h" 77d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h" 78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 790e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 80a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 81853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 84ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr; 85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 86853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 883c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 90a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 91cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 94b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 95549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 1007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 101dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 102d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 10311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 104853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 105af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew; 106ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 107ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 108a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 109a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 110a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1138ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 115853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 116853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 123c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234; 124125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999"; 125235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 126235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi 127235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// capabilities of a NIC with wiphy index |kNewWiphyNlMsg_WiphyIndex| which 128235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// supports operating bands with the frequencies specified in 129235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// |kNewWiphyNlMsg_UniqueFrequencies|. 130235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint8_t kNewWiphyNlMsg[] = { 131235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x68, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 132235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xf6, 0x31, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 133235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30, 134235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 135235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00, 136235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff, 137235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00, 138235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x00, 0x00, 139235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 140235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd1, 0x08, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 141235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00, 142235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x8b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x18, 0x00, 0x39, 0x00, 143235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 0x02, 0xac, 0x0f, 0x00, 144235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0xac, 0x0f, 0x00, 0x06, 0xac, 0x0f, 0x00, 0x05, 0x00, 0x56, 0x00, 145235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00, 146235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x03, 0x00, 0x00, 0x00, 147235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x69, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6a, 0x00, 148235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00, 149235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 150235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 151235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x09, 0x00, 0x50, 0x05, 0x16, 0x00, 0xf8, 0x01, 0x00, 0x00, 152235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 154235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 155235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00, 156235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00, 157235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 158235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 159235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 160235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 161235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00, 162235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 163235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 164235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 165235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 166235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00, 167235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 168235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 169235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 170235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 171235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00, 172235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00, 173235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 174235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 175235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa3, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 176235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 177235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 178235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 179235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb4, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 180235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 181235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 182235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 183235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x00, 184235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 185235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00, 186235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 187235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 188235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 189235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 190235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00, 191235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00, 192235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0b, 0x00, 193235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x54, 0x03, 0x01, 0x00, 194235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 195235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 196235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 197235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0x00, 198235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00, 199235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 200235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 201235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 202235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00, 203235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 204235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 205235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 206235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x8c, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 207235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 208235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 0x00, 0x00, 209235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 210235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 211235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 212235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 213235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 214235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc8, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 215235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 216235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 0x15, 0x00, 0x00, 217235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 218235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x09, 0x00, 219235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 220235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 221235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 222235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa4, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 223235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 224235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 0x00, 0x00, 225235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 226235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0c, 0x00, 227235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 228235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 229235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 230235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 231235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 232235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00, 233235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 234235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 235235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 236235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 237235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 238235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 239235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 240235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00, 241235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 242235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00, 243235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 244235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 245235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00, 246235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 247235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x16, 0x00, 0x00, 248235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 249235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00, 250235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 251235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00, 252235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 253235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 254235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc1, 0x16, 0x00, 0x00, 255235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 256235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 257235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 258235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00, 259235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 260235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 261235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 262235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 263235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 264235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xd4, 0x00, 0x32, 0x00, 265235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 266235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 267235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 268235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x19, 0x00, 0x00, 0x00, 269235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 270235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x00, 271235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 272235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x00, 0x00, 273235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 274235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x43, 0x00, 0x00, 0x00, 275235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 276235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x42, 0x00, 0x00, 0x00, 277235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x13, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 278235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x00, 279235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x16, 0x00, 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 280235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 281235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x19, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 282235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x88, 0x13, 0x00, 0x00, 283235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x6c, 0x00, 0xac, 0x03, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00, 284235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 285235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 286235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 287235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 288235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 289235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 290235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 291235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 292235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 293235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 294235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 295235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 296235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 297235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 298235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 299235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 300235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 301235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 302235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 303235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 309235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 310235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 311235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 315235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 316235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 317235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 318235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 319235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00, 329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00, 340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 344235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00, 351235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 352235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 360235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x14, 0x01, 0x64, 0x00, 362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 367235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 368235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 372235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 373235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 374235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 375235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 376235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 377235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 378235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 379235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00, 380235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 381235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 382235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00, 385235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x50, 0x00, 0x78, 0x00, 386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x4c, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00, 387235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00, 389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x18, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x0c, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x09, 0x00, 391235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00, 393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1e, 0x00, 0x94, 0x00, 0x42, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint32_t kNewWiphyNlMsg_WiphyIndex = 2; 397b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewartconst int kNewWiphyNlMsg_Nl80211AttrWiphyOffset = 4; 398235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint16_t kNewWiphyNlMsg_UniqueFrequencies[] = { 399235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 400235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2462, 2467, 2472, 2484, 5180, 5200, 5220, 5240, 5260, 5280, 401235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 402235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825}; 4035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 404d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint32_t kScanTriggerMsgWiphyIndex = 0; 405d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kActiveScanTriggerNlMsg[] = { 406d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x44, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 408d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 409d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 410d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x2c, 0x00, 411d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 412d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 413d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 414d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 415d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 416d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 417d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 418d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 419d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 420d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 421d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 422d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 423d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 424d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 425d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 426d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 427d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 428d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 429d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 430d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 431d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 432d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 433d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 434d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kPassiveScanTriggerNlMsg[] = { 435d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x40, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 436d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 437d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 438d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 439d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x04, 0x00, 0x2d, 0x00, 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00, 440d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 441d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 442d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00, 443d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 444d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00, 445d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 446d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00, 447d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 448d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00, 449d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 450d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00, 451d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 452d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00, 453d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 454d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00, 455d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 456d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00, 457d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00, 458d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00, 459d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00, 460d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00, 461d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 462d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 4645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 4653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 466853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 4673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 4680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan : metrics_(nullptr), 4693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal device_( 4703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new WiFi(control_interface(), dispatcher(), &metrics_, 4713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal manager(), "wifi", "", kInterfaceIndex)) { 472853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 4733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 474853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 475853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 4763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMetrics metrics_; 4778abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 478853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 479853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 4803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 481f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 482de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 483853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 484853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 485fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// TODO(zqiu): update this test after dbus-c++ dependencies is removed from 486fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// PropertyStoreTest. 4876bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 488a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 489a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 4906bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 491de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 492f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanSignalThresholdProperty, 493a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 494a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 495a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 496a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 497a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 4986bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 499f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanIntervalProperty, 5006bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 5016bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 502a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 503853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 504a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 505a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 5066bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 507f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanningProperty, 5086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 5096bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 510bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 5119d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 512a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 513853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 5154d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 5166bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 5174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 518f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 5194d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 5200654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 5214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 5244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 5254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 5266bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 5274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 528f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 5294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 5304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 5334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 534fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// TODO(zqiu): update this test after dbus-c++ dependencies is removed from 535fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// PropertyStoreTest. 5364a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 5370654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 5388abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 5394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 5414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 542e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 543e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 544f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5460654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 5478abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5488abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 5496bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 5508abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 551f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 552f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn), 5538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 5540654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 555e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 556f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5570654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 5588abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5598abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 560f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan device_->mutable_store(), kBgscanMethodProperty, &error)); 561e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 562f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5658abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 5668abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5673c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 575e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 5763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 57777994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // Note: When this constructor is called (via the initialization lists in the 57877994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // constructors of WiFiMainTest and WiFiTimerTest), |dispatcher| will point to 57977994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // an uninitialized EventDispatcher. Any functions (including constructors in 58077994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // the initialization list) that use the message loop should not be called in 58177994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // this constructor, since the delayed initialization of the message loop can 58277994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // cause concurrency-related bugs. (See crbug.com/509138 for an example.) 5832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart explicit WiFiObjectTest(EventDispatcher* dispatcher) 584e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 5850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan metrics_(nullptr), 5860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan manager_(&control_interface_, nullptr, &metrics_, &glib_), 587e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 588fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_, 589fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan kDeviceName, kDeviceAddress, kInterfaceIndex)), 5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 591fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan mac80211_monitor_(new StrictMock<MockMac80211Monitor>( 592fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold, 593fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan base::Closure(), &metrics_)), 594084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_service_proxy_(new MockDBusServiceProxy()), 595dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 596af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()), 597af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)), 598084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_(new DBusManager()), 5990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 600735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 6013c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 602fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu new NiceMock<MockSupplicantInterfaceProxy>()), 603fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu supplicant_network_proxy_(new NiceMock<MockSupplicantNetworkProxy>()) { 6043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->mac80211_monitor_.reset(mac80211_monitor_); 6055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 606fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_process_proxy_.get(), CreateInterface(_, _)) 607fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 608fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 609fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_process_proxy_.get(), GetInterface(_, _)) 610fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 611fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 612fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), AddNetwork(_, _)) 613fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 614fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 615fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), Disconnect()) 616fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 617fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), RemoveNetwork(_)) 618fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 619fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), Scan(_)) 620fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 621fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_network_proxy_.get(), SetEnabled(_)) 622fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 623c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 6243946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_)) 6253946da840142cd386d628c0e879459f8976bd86dmukesh agrawal .Times(AnyNumber()); 6263946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 6278e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu ON_CALL(dhcp_provider_, CreateIPv4Config(_, _, _, _)) 628af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(Return(dhcp_config_)); 629af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true)); 6302d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false)); 631af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan 632af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateDBusServiceProxy()) 633af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_)); 634af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _)) 635af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_)); 636af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _)) 637af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_)); 638af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _)) 639af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_)); 640af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)) 641fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(ReturnAndReleasePointee(&supplicant_network_proxy_)); 642318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 643ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 644735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 645735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 646735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 6472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 6483c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 6495c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 650bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 6515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 6520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 6535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 6555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 6565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 6575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 6585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 6593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6605c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6615c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 6623ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 6633ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 664d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 665084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->proxy_factory_ = &proxy_factory_; 666ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 6672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart static_cast<Device*>(wifi_.get())->rtnl_handler_ = &rtnl_handler_; 6685c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 6693c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 6702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 671b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 67277994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // Must be called here instead of in the constructor so that the destructor 67377994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // of SimpleAlarmTimer will not be invoked before the EventDispatcher is 67477994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // properly constructed (crbug.com/509138). 67577994d69bae79ce07d3830c4f83144503a06b224Samuel Tan InstallMockWakeOnWiFi(); 6765c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 6775c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 6793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 6800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillRepeatedly(Return(nullptr)); 6810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SelectService(nullptr); 682b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 683b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 684b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 6853946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 6860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->proxy_factory_ = nullptr; 6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 6883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 6893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 6900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Stop(nullptr, ResultCallback()); 6910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->set_dhcp_provider(nullptr); 692084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Stop(); 6930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan dbus_manager_->proxy_factory_ = nullptr; 6943ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 6953ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 696d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 697f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 698f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 699549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 700549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 7013946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 7020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(false); // Stop(nullptr, ResultCallback()); 703549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 704549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 70517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 7060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 70717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 708c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 7115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 7145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 7155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 7165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 7195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 7205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 7215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 7225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 7295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 7305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<uint16_t> available_frequencies; 7315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 7325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 7335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 7345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 7355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 7365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 7375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 7395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 741f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 7420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr); 7435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 7445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 746fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan void InstallMockWakeOnWiFi() { 747fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_, 7481897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan &metrics_); 749fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_->wake_on_wifi_.reset(wake_on_wifi_); 750fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan } 751fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan 7525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 7535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 7545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 7555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnTriggerScanResponse(const Nl80211Message& message) { 7585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 7595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 761b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 762b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 7632b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* reason) { 764b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 765b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 766b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 7679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 7680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 7690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 7700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 7710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 7727fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRoamThresholdMember(uint16_t threshold) { 773227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 774227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 775227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7767fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetRoamThreshold(uint16_t threshold) { 777227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 778227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 779227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7807fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t GetRoamThreshold() const { 781227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 782227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 783227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 7857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 7867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 7872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 7893c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 790bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 7912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr& service) 792bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 793bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 794bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 795bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 7962b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiEndpointConstRefPtr& endpoint) { 797bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 798bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 799bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 8003c5040174273386868cc8dea8044d22c465885d8Paul Stewart 8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 8033c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 8053c5040174273386868cc8dea8044d22c465885d8Paul Stewart 8062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EndpointRemovalHandler* MakeEndpointRemovalHandler( 8072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& service) { 8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 8093c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 812b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 8133c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 8163c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 8172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char* mode, 8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 8192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* ssid, 8202b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* path, 8212b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* bssid) { 8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 8233c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 824a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *ssid = StringPrintf("ssid%d", bss_counter_); 8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 826a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *path = StringPrintf("/interface/bss%d", bss_counter_); 827a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_); 8283c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 8293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 8303c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 8313c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 8323c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string& ssid, const string& bssid) { 8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8363c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 8372b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, const string& bssid, const string& mode) { 8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 8390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0); 8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 8422b363903f38a515001c5edc7202403fcddb15a01Paul Stewart vector<uint8_t> ssid, const std::string& security) { 8433c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 8493c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 850f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string& security) { 8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 8563c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 857fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string MakeNewEndpointAndService(int16_t signal_strength, 858fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 859fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode, 860fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu WiFiEndpointRefPtr* endpoint_ptr, 861fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr* service_ptr) { 8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 863fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path; 8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 8673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8713c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 8723c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 8743c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8773c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8793c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8803c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 881fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string AddEndpointToService( 8823c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 8847fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 8852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode, 8862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr) { 8873c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 888fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path; 8893c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8903c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8913c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 8923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8933c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8943c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8953c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8963c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8973c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9003c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 9010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->ConnectTo(service.get()); 9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 9040951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFrom(service.get()); 9053c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein void InitiateDisconnectIfActive(WiFiServiceRefPtr service) { 9070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFromIfActive(service.get()); 908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein } 9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 910fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& network_path, 9112b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr, 912fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path_ptr) { 9133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 9143c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 915fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path(MakeNewEndpointAndService( 9163c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 917a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart if (!network_path.empty()) { 918a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 919fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)) 920fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(DoAll(SetArgumentPointee<1>(network_path), Return(true))); 9218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 9228e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetHT40Enable(network_path, true)); 923a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 924a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 9253c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 9263c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 9270951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 9293c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9303c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9313c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9323c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9343c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9353c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9363c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9383c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 939fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& network_path, 9402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr, 941fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path_ptr) { 9423c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 943fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 9443c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 9453c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 9463c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9473c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9483c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9493c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9503c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9513c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 9533c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 9543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 9550951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9563c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 958bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 9598e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 9608e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 9613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 962a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 9630654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 9640951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9653c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 9673c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 969d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 970b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 971b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 972b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 9732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 9742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 9750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 9762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 9770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 9782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 979c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 9802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& GetCurrentService() { 9811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 9821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 9832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetCurrentService(const WiFiServiceRefPtr& service) { 984bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 985bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 9862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& GetEndpointMap() { 987165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& GetPendingService() { 9901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 9911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 9922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetPendingTimeout() { 9932b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 9942b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 9952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetReconnectTimeoutCallback() { 996446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 997446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 9982b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const ServiceRefPtr& GetSelectedService() { 9992ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 10002ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 10012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& GetSupplicantBSS() { 10027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 10037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 10042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetSupplicantBSS(const string& bss) { 10057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 10067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 10071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 10081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 10091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 10102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetScanTimer() { 1011b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 1012b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 10133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 1014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 10153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 10162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart SupplicantProcessProxyInterface* GetSupplicantProcessProxy() { 10173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxyFromWiFi() { 10202b363903f38a515001c5edc7202403fcddb15a01Paul Stewart return dynamic_cast<MockSupplicantInterfaceProxy*>( 10218a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10233c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 10243c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 10253c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 10263c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 10272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxy() { 10282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* proxy = GetSupplicantInterfaceProxyFromWiFi(); 10293c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 10303c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 10312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& GetSupplicantState() { 10327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 10337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 10341caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int GetSupplicantDisconnectReason() { 10351caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein return wifi_->supplicant_disconnect_reason_; 10361caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein } 10372b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ClearCachedCredentials(const WiFiService* service) { 1038835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 1039835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 10402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr& endpoint) { 10410427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 10420427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 1043fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bool RemoveNetwork(const string& network) { 1044381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 1045381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 1046fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore CreateBSSProperties(const string& ssid, 1047fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& bssid, 1048fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu int16_t signal_strength, 1049fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 1050fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode); 1051fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void RemoveBSS(const string& bss_path); 1052fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void ReportBSS(const string& bss_path, 10532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, 10542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& bssid, 10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10567fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode); 1058c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 10593c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, true); 10603c3c36a37a885d0a2e180998587af8390744f757Samuel Tan } 10613c3c36a37a885d0a2e180998587af8390744f757Samuel Tan void ReportIPConfigCompleteGatewayArpReceived() { 10623c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, false); 1063c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 1064050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1065050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Calls the delayed version of the BSS methods. 1066fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSAdded(const string& bss_path, 1067fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties) { 1068050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAdded(bss_path, properties); 1069050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1070fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemoved(const string& bss_path) { 1071050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSRemoved(bss_path); 1072050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1073050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1074787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void ReportIPv6ConfigComplete() { 1075787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnIPv6ConfigUpdated(); 1076787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1077f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 1078f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 1079f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1080f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 1081f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 1082f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1083f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 1084f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 1085f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 10862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ScanDone(const bool& success) { 10873cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanDone(success); 10883cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10893cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan void ReportScanFailed() { 10903cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanFailedTask(); 10913cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 10935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 10945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 10955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 10965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 10975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 10985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 10995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 1100dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 11013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 11022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportCurrentBSSChanged(const string& new_bss) { 11031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 11041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 11052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportStateChanged(const string& new_state) { 11067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 11077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 11081caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein void ReportDisconnectReasonChanged(int reason) { 11091caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein wifi_->DisconnectReasonChanged(reason); 11101caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein } 11115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 11125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 11135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 11147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 11157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 11167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 11172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportReceivedStationInfo(const Nl80211Message& nl80211_message) { 11187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 11197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 1120baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 11210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 1122baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 11232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetPendingService(const WiFiServiceRefPtr& service) { 1124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 1125cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 112611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 11272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& service, const string& rpcid) { 112811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 112911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 11303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan bool RpcIdByServiceIsEmpty() { 11313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan return wifi_->rpcid_by_service_.empty(); 11323fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetScanInterval(uint16_t interval_seconds, Error* error) { 1134bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 1135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 1136e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 11370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 1138e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 11392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1142a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 1143a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1144a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1145a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 1146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 1149a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1150a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 1152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 11535412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 1154a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1155125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 1156125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 1157125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 1158125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 1159125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 1160125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 1161125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 1162084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 11632b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 11640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 1165125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 11660951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko // Mimic the callback from |dbus_service_proxy_->GetNameOwner|. 1167125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 11683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 11692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 11702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 11712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11722f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 1173787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnAfterResume()); 11742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 11752f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 11762f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 1177fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 1178fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1179fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 11802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 1181787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnDarkResume() { 1182787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ResultCallback callback( 1183787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1184787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnDarkResume(callback); 1185787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 11863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void RemoveSupplicantNetworks() { 11873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->RemoveSupplicantNetworks(); 11883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11895d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void InitiateScan(Device::ScanType scan_type) { 11905d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScan(scan_type); 11913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void InitiateScanInDarkResume(const WiFi::FreqSet& freqs) { 11935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScanInDarkResume(freqs); 1194381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan } 11952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TriggerPassiveScan(const WiFi::FreqSet& freqs) { 11965d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->TriggerPassiveScan(freqs); 11973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 1199084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 12002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 12012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 12022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 1203084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 12042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 12052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 12062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 12072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 12082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 1209687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 1210687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 1211687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 12122b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetIPConfig(const IPConfigRefPtr& ipconfig) { 1213687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 1214687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 12152b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanMethod(const string& method) { 1216fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Error error; 1217fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return wifi_->mutable_store()->SetAnyProperty(kBgscanMethodProperty, 1218fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu chromeos::Any(method), 1219fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu &error); 12204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 12214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 12222b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void AppendBgscan(WiFiService* service, 1223fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore* service_params) { 12244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 12254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 12264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1227fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void ReportCertification(const KeyValueStore& properties) { 1228bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 1229bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 123010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 12312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportEAPEvent(const string& status, const string& parameter) { 1232db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 1233db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 1234db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 1235e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 1236e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 1237e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 1238e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 12392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void SetFastScansRemaining(int num) { 12402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->fast_scans_remaining_ = num; 12412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 12422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 12431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 12441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 12451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 12481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 12491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12512b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetLinkMonitor(LinkMonitor* link_monitor) { 12523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 12533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 12552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr& service, 12562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Service::ConnectFailure* failure) { 12571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 12581369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 12591369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 12603c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 12613c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 12623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12633c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 12648e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 12658e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 12668e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 12678e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 12682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanShortInterval(const uint16_t& interval, Error* error) { 1269bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 1270bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1271bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanSignalThreshold(const int32_t& threshold, Error* error) { 1273bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 1274bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1275bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12762b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetTDLSManager(TDLSManager* tdls_manager) { 1277618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu wifi_->tdls_manager_.reset(tdls_manager); 1278df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1279df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 12802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TDLSDiscoverResponse(const string& peer_address) { 1281618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu wifi_->TDLSDiscoverResponse(peer_address); 1282df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1283df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1284618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu string PerformTDLSOperation( 12852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& operation, const string& peer, Error* error) { 1286c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 1287c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 1288c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 1289df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 1290df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 1291df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 1292df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 12932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnNewWiphy(const Nl80211Message& new_wiphy_message) { 12943946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 12953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 12963946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 1297787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 1298787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 1299787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1300787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 13012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart NiceMockControl* control_interface() { 130210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 130310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 130410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 13052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMetrics* metrics() { 130685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 130785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 130885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 13092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockManager* manager() { 13103239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 13113239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1312d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 13132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockDeviceInfo* device_info() { 1314d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 1315d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1316d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 13172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockDHCPProvider* dhcp_provider() { 1318d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 1319d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1320d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 13213239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 13223239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 13233239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 13243239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 13252b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockProxyFactory* proxy_factory() { 1326b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 1327b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 1328b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 13292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWiFiProvider* wifi_provider() { 13303c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 13313c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 13323c5040174273386868cc8dea8044d22c465885d8Paul Stewart 13332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMac80211Monitor* mac80211_monitor() { 13343946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 13353946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 13363946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 13371964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 13381964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 13391964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 13401964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 13412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void StartScanTimer() { 13422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->StartScanTimer(); 13432d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 13442d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 13452b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool ParseWiphyIndex(const Nl80211Message& nl80211_message) { 1346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return wifi_->ParseWiphyIndex(nl80211_message); 1347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; } 1350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1351d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; } 1352d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::set<uint16_t>* GetAllScanFrequencies() { 1354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return &wifi_->all_scan_frequencies_; 1355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 13572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnScanStarted(const NetlinkMessage& netlink_message) { 1358d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan wifi_->OnScanStarted(netlink_message); 1359d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan } 1360d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13613cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan bool ScanFailedCallbackIsCancelled() { 13623cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan return wifi_->scan_failed_callback_.IsCancelled(); 13633cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 13643cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 136514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan void SetWiFiEnabled(bool enabled) { 136614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan wifi_->enabled_ = enabled; 136714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan } 136814ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 13692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MOCK_METHOD1(SuspendCallback, void(const Error& error)); 1370fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 13712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EventDispatcher* event_dispatcher_; 13722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockScanSession* scan_session_; // Owned by |wifi_|. 13732b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWakeOnWiFi* wake_on_wifi_; // Owned by |wifi_|. 13745c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 13755c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 13763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1378dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 13793426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 1380f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 13812ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 1382c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 13833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 13843c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 13853c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 13862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMac80211Monitor* mac80211_monitor_; // Owned by |wifi_|. 13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 13913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 1392626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 13943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 1395446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 1396446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 13977fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 13983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1399ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 1400ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 1401ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1402f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1403f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 14042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart DBusManager* dbus_manager_; 1405735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1406735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1407735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 14082b363903f38a515001c5edc7202403fcddb15a01Paul Stewart DeviceMockAdaptor* adaptor_; 14092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantEAPStateHandler* eap_state_handler_; 1410bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 14113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1413ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1414fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu unique_ptr<MockSupplicantNetworkProxy> supplicant_network_proxy_; 1415af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1418e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1419e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1420e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1421e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1422446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1423446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 14247fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 14253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1426fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::RemoveBSS(const string& bss_path) { 1427b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1428261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1429261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1430fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuKeyValueStore WiFiObjectTest::CreateBSSProperties( 14312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, 14322b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& bssid, 1433050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1434050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 14352b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode) { 1436fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore bss_properties; 1437fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint8s("SSID", vector<uint8_t>(ssid.begin(), ssid.end())); 14383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 14393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 14403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1441a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 14423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 1443fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint8s("BSSID", bssid_bytes); 14443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1445fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetInt16(WPASupplicant::kBSSPropertySignal, signal_strength); 1446fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint16(WPASupplicant::kBSSPropertyFrequency, frequency); 1447fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetString(WPASupplicant::kBSSPropertyMode, mode); 1448050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1449050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart return bss_properties; 1450050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 1451050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1452fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::ReportBSS(const string& bss_path, 1453fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& ssid, 1454fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& bssid, 1455fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu int16_t signal_strength, 1456fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 1457fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode) { 1458050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAddedTask( 1459050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bss_path, 1460050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode)); 14613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1469a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1470a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1471a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1472a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1474a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1475a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 14779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1481f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1482a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 14869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 14879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 14899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 14922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint, 1493fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path) { 14949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 14959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 14969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 14979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1499fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string dummy_bss_path; 15009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 15019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 15029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 15039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1504a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 15069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 1507fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", endpoint, bss_path); 15089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 15099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 15109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 15119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 15129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 15139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 15149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 15152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 15172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1519a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 15212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1522a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 15232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1524f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1531a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1532f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1534a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1538a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1539a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1540a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1541a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1542a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1543a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1544a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1545a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1546a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1547a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1548a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1549a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1550a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1551a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1552a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1553a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1555a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1556e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1557e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1558e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 15593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 15600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 15640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 15650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15682b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 15692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 15702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1572227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1573227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1574227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1575227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1578227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1579227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1580227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1581227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1582227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1583227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1584227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1585227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1586227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1587227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1588227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1589e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan 1590e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan // Do not set supplicant's roam threshold property immediately if the 1591e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan // current WiFi service has its own roam threshold property set. 1592e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1593e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan service->roam_threshold_db_set_ = true; 1594e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan SetCurrentService(service); 1595e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(_)).Times(0); 1596e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1597e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_EQ(kRoamThreshold16, GetRoamThreshold()); 1598227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1599227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 16002b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 16010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 16040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1606227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1607227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1608227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1609227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1610227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1611227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1612227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1613227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 16142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 16169cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 16179cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 16189cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 16199cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 16209cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 16219cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16242b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 16250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16299cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 16309cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 16319cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 16329cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16339cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 16342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16362b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 16370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 16400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 16412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 16442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 16452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16482b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 16492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16512b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16522b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16532b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16542b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1655549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 1659fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr)); 1660549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1661549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1662c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1663549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1664549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1665549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1666ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16693c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1672549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1673549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 16740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1675549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1676549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 16785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 1679fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)); 1680fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)) 16813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 1682fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1683b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 16843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16853c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 16863239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 16883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 1691fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)); 1692fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)) 16935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 1694fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 16955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 16965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 17005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1702835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 17033c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1704fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 17050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 17070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1708835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1709835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 17100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 17110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 17120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 17130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 17140427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 17150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 17160427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1717381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1718fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 1719381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1721fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(true)); 1722381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1723381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1724381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1725ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1726316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1727316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1728316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1729316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 17308e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true)) 1731316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 17322b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 1733316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1734316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1735316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1736316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1737316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1738316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1739316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 17408e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true)) 1741ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 17422b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 17430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1744316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1745316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1746316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1747316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 17488e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, false)) 1749316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 17502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 1751ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1752ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1753fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuTEST_F(WiFiMainTest, RemoveNetworkFailed) { 1754fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1756fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1757381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1758381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1759381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1760381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 17615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 17625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 1763fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)) 17643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 1765fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1766fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)); 17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 17683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17693239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 17703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 1773fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)) 17745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 1775fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 17765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 17775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 17823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 17833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 17843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 17882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 17892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 17932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1794f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 17952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 17962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 17972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1799c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1801c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1802c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18030951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1813c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1814c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18150951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1817c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1821c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 18223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1823c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1825c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1826c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18270951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1829c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 18312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1834c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1835c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 18392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1841c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1842c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 18435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 18442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1848f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 18535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18560951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 18672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18690951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 18732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 18765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 18775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 18782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18820951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 18862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 18875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 18882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18953cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) { 18963cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan StartScan(WiFi::kScanMethodFull); 18973cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ExpectScanStop(); 18983cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 18993cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ReportScanFailed(); 19003cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 19013cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 19023cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 19035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 19045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1906ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1907ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19083c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19095c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1910ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1911ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 19122f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1913ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1914ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1915ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 19225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 19250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 19260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 19270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19313a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 19323a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 19333a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19343a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19353a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 19363fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 19373fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 19383a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 19393a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19403a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 19413fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 19423a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 19433a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 19443a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19463a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 19473a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 19485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 19495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1951ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1952ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19533c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1954ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1955ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19562f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1957ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1958ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1959ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 19615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 19695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 19735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1975ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1976ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 1979fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 19813c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 19823ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1984ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19852f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1986ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1987ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1988ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 19905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 1995fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 19965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 19975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 19985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 20005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2001df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 20025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 20035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 20045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 20055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20068e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 20078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 2008fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 20098e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20108e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 20118e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 20128e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20138e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 20148e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 20163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 20173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2018e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 20193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2020e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 20213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2022e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 20233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2024e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 20257fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 2026e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 2027e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 2028e41a72d0737488d561a4158019409d5785dad61bThieu Le 20292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap(); 2030e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 2031e41a72d0737488d561a4158019409d5785dad61bThieu Le 2032e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 2033e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 2034e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 2035e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 2036e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 2037e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 2038e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 2039e41a72d0737488d561a4158019409d5785dad61bThieu Le } 2040e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 2041e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 2042e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 2043e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 20443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 20453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 20463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 20473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 20483c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 20603c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 2061381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan manager()->set_suppress_autoconnect(true); 20623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 2063381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 2067b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 20680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 2069e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 2070b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 2071e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 2072e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 20738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 20768a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20773c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2078fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 20793c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2080fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, &bss_path)); 2081ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20823c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20853c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20868a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20873c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2088261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 2089261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 2090261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 2091261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 20923c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2093fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 20943c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2095fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, &bss_path)); 20963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 21003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 21013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2102835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 2103835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 2104fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath = "/test/path"; 21050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 2106835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2107835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2109835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21113c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 21130654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2114835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2115835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 2116a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 2117a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 2118fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).Times(0); 21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 2120835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 2121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 2122835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 21230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 21240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2126fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 21283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21294943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 21304943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21314943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21324943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 21334943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 21340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21354943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 21364943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21374943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 21384943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 21394943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 2140fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 21414943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 21424943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21434943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 21443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21463c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 21470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 21510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21523c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 2153fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 21543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 21550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21573c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 21593c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 21620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 21633c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 21673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 21703c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 21710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 21730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 21740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 21760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 21780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 21813c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2182fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 21830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21854943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 21890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 21900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 2191835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2192835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 2193ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 2194af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 2195af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 2196af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 2197af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2198fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true)); 2199735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 22003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22014943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 22024943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22034943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22054943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22064943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 22074943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22084943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 22094943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 2210fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 22110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22124943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22134943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 22144943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22154943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 22164943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 22174943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 22184943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22194943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 2220ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 22214943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 22224943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 22234943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 22244943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2225fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true)); 22264943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 22274943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22284943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 22294943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22300654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22323c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 22340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 2235c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 22363c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2237fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 22380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2240fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(false)); 22413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2242c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 2243c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 2244c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 2245c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 22460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 2248c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 2249c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 22500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 22510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 2252fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2254fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService("", 22550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 22590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 22600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 22610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22632b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 22644943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22654943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22664943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 22674943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22682b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 22692b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 22701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 22711aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 2272fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 22730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22741aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22751aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 22761aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 22771aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 22781aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 22811aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 22821aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 22841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 22850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 22871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 22891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 22911aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 2292d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 2293d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2294fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2296d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2297d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2298d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2299d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2300d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2301d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2302d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 2303d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2304d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2305d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23060951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2308d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2309d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2310d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 2312d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2313fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 23140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2315d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2316fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service1(SetupConnectedService("", 23170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2318d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2319d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2320d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2322d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2323d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2326d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2328d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2329d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23300951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2331d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2332d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2333d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2334d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2335d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 2336d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2337fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 23380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 23390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 2340d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 2341d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2342d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2343d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2344d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2345d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2346d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 2347d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2348d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2349d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 2350d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2351d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2352d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23530951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2354d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2355d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2356d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2357d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 235817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 23599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 23602b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& pending_timeout = GetPendingTimeout(); 236117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 23629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 23639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 236444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 236544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 236617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 236717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 236817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 23690d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 23700d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 23710d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 237217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 237317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 237417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 237533a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 237617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 23770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 237844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 2379a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 238044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2381a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 2382a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2383a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 23840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 23850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 23860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 238717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 23880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 238933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 239033a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 23910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 23920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 23930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 23940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 239517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 239617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 239717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 23982b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 23992b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& pending_timeout = GetPendingTimeout(); 24002b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 24013c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2402fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 24032b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 24042b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 240517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 240617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 24070d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 24080d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 24090d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 241017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 241117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 241217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 241317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24143c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 24150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 24190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 24203c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 24223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 24230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2428fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 24290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 24303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2431fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 24323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 24330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24375c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2438c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 24393c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 2440fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 24410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 24423c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 24430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 24443c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 24460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 24480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2450c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2451b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2452c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 24535c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 24545c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2455549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24583c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2459fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr)); 2460ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 24623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 24633c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2466549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 24670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2468549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2469549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2470446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 24713c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24723c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2473fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 24743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 24751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24760654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24780654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24800654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2482446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 24831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24840654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24851aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 24883c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 24891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2490446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2491446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 2492fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu 24935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2494fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu if (!arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs)) { 2495ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2496ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2497ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2498fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ByteArrays ssids = arg.GetByteArrays(WPASupplicant::kPropertyScanSSIDs); 2499ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2500ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2501ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2502ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 25043c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25053c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 2507fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return !arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs); 2508ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2509ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 25105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 25115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25123c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 25133c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 25143c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 25153c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25163c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 25173c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 25185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 25195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 25203c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 25213c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25223c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 25265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 25315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2535ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 25365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25375412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 25385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 25425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25583c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 25595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25615412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2562ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2563ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2564ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2565fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2566fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2567fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2568fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2569fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 25703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 25715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2572fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2573fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2574fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2575fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2576fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2577fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2578fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 25791e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 25801e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 25811e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 25821e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 25831e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 25841e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 2585fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(false)); 25861e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 25871e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 25881e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 25891e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 25901e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 25915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 25925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 25945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 25955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 25979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 25987de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 25995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 26022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2608f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2609df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2610df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2611df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2612f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 26185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 26195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 26205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 26225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 26255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 26265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 262944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 263044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 263144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 263244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 26335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 26349f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 26382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26397de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 26405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 26455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 26465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 26485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 26495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 26520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 26535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 26555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2656a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2657a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 26600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 26640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 26662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 26672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 26682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 26695412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 26702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 26715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 26732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 26745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 26755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 26760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 26790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 26802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 26810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 26822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 26830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 26877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 26887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 26907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 26917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 26920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 26930654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 26947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 26967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 26977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 26987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 26997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2700f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 27017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 27030654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 27047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2707d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 27087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 27117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 27127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 27138e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 27148e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 2715d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 27167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 27177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2718f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2719bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2720bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2721bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 27227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27230654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 27240654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 27250654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 27267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 27277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 27303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 27317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2733a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 27342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get(); 2735a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2736a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2737f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2738fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 2739a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2740a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2741a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2742a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2743a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2744a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2745a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2746a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2747a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2748a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2749a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get(); 2751a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2752a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2753f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2754fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 2755fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 2756fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 2757fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 27580654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2759a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2760a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2761a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2762a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2763a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2764a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2766a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2767a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2768a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 27692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2770fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 2771fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 2772fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 2773fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 27740654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2775a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 27760654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2777a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2778a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27791590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 27801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27813c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 27823c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 2783fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr); 27841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 27854943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 27860654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 27880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2789687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 27901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 27911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 27921590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 27931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27943c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 2795fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 27963c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 2797fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path1(MakeNewEndpointAndService( 27980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 27993c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 28001590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2801c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2802c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2803c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2804c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 28053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 28063c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 28073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2808bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2809a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 28100654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2812687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 28140951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 28151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 28161590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2817e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2818e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 28190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 28200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 28210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28223c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 2823fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 28243c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2825fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path = 28263c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 28273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 28283c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2829687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 28300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2831687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2832687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2833687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2834687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2835687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2836687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2837687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2838687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2839687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2841687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28424eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 28434eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 28441caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonUpdated) { 28451caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ScopedMockLog log; 28461caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason = 4; 28471caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason_second = 0; 28481caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)) 28491caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein .Times(AnyNumber()); 28501caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), WiFi::kDefaultDisconnectReason); 28511caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(log, 28521caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein Log(logging::LOG_INFO, _, EndsWith(" DisconnectReason to 4"))); 28531caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason); 28541caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason); 28551caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(log, 28561caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein Log(logging::LOG_INFO, _, EndsWith("Reason to 0 (was 4)"))); 28571caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason_second); 28581caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason_second); 28591caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein} 28601caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein 28611caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonCleared) { 28621caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason = 4; 28631caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // Clearing the value for supplicant_disconnect_reason_ is done prior to any 28641caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // early exits in the WiFi::StateChanged method. This allows the value to be 28651caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // checked without a mock pending or current service. 28661caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason); 28671caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, test_reason); 28681caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 28691caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 28701caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, 28711caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein WiFi::kDefaultDisconnectReason); 28721caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein} 28731caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein 28748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 28758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28763c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 2877fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 28783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 28798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 28803c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 2881fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 28823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 28830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 28848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 288649c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 288749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 2888fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 288949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 289049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 2891fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, &bss_path)); 289249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 2893fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 289449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 289549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 289649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 289749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 289849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 289949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 290049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 290149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 290249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 29030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 29040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 290549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 290649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 290749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 29088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 29098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 29108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 29113c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2912fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 29138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 29148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 29158a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 29164a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 2917fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return arg.ContainsUint(WPASupplicant::kNetworkPropertyScanSSID) && 2918fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu arg.ContainsUint(WPASupplicant::kNetworkPropertyDisableVHT) && 2919fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu arg.ContainsString(WPASupplicant::kNetworkPropertyBgscan) == bgscan; 29204d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 29234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 29243c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2926a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 2927fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 2928fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu AddNetwork(WiFiAddedArgs(true), _)); 29290654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 29304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 29314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 29344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 29353c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2937a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 2938fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 2939fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu AddNetwork(WiFiAddedArgs(false), _)); 29404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 29434a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 29444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2945f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 29464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 2948fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 29500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29510951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2952fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 29534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 2956fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 29580951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 2961fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 2962fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu config_string = params.GetString(WPASupplicant::kNetworkPropertyBgscan); 29634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 29674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 29684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 29720654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 2973fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29760951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2977fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 2978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string config_string = 2979fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu params.GetString(WPASupplicant::kNetworkPropertyBgscan); 29804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 29844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29865c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 29875c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 29880654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 2989fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29915c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 29920951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29935c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 2994fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 29955c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 29964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2998c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2999c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 30003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 3001fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 3002c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 3003c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 3004c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 3005c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3006c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 3007c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 30080951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3009c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 3010c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3011c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 3012c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 30133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 3014fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 30158f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 3016c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 30178f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 30188f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 30190654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 30205519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 30213c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 30248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 30258f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 30265519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 30275519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 30283c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30293c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 30303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30310654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 3033c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3034b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 3035b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 3036b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 3037b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 3038b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 3039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 3040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 3041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 3042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3043b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 3044b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 3045b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 3046b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 3047b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 30482b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantBSSProxy* proxy = supplicant_bss_proxy_.get(); 3049b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 3050b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 3051fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path( 30520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 30530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 30543c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 3055b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 3056b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 3057b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 3058b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3059b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 30605c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 30615c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 30625c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 30635c05b2920be742d518829972127172481722058dmukesh agrawal 30645c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 30655c05b2920be742d518829972127172481722058dmukesh agrawal 30665c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 30675c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 30685c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 30693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 30705c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 30712f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 30725c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 30735c05b2920be742d518829972127172481722058dmukesh agrawal} 30745c05b2920be742d518829972127172481722058dmukesh agrawal 3075402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 3077402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30784b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto- 30794b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // connectable services. 3080402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3081402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 3082402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30834b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)); 3084402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3085402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3086402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 3087402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3088402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3089402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 3090402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30914b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3092402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3093402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3094402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3095402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 3096402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3097402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 3098402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 3099402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3100402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 31014b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3102402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3103402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3104402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 3105402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 31065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 31075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 3108b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3113b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31147de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3116b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 3117b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3118b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3119b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3120b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3121b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 31235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 31245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 31265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 31275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 31280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3129df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 31305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 31315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 31325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 31345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 31355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 3137b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3141b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 3143b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 3144b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3146b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3147b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3148b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3149b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3150b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3151b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 3152b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3153b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 31543c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 3155fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr); 3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3158b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3159b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3161b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3162b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3163b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3164b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3165b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) { 31672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EnableFullScan(); 31682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartWiFi(); 31692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ReportScanDone(); 31712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan CancelScanTimer(); 31722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 31732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 31742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true)); 31772d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31782d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan FireScanTimer(); 31792d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31802d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); // Do not re-arm. 31812d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 31822d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 3184b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3185b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 3189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3192b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 3193b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3197b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3201b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 3202b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3203b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3204b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 3206b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3207b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3208b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 32105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 32115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 32125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 3213fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 32145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 32155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 32165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 3217a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 32205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 32215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 32225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 32235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 32245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 32255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 3227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3228b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 32295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 3230fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 3231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 32323c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 32333c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 32343c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 3235a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32373c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 32385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 32390654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3240b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3241b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3242b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3243b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 3244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3245b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3246fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 3247b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 3248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 32493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32503c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 32510654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3252b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3253b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3254b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 32563c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 32582ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 32593c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 32602ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 32613c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 32623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 32633c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 32642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 32662ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 32673c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 32683c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 3269daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32732ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 32742ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 32752ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 32762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 32772ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32782ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 32792ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32802ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32812ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 3282a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3283a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu SetCurrentService(service); 32842ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 32853c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3286daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 3287fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()) 3288fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(true)); 32893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32903c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3291a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu 3292a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu // Service is unreliable, skip reassociate attempt. 3293a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu service->set_unreliable(true); 3294a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3295a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EndsWith("skipping reassociate attempt."))).Times(1); 3296a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 3297a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu OnLinkMonitorFailure(); 3298a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 33003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 33018e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 33028e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 3303fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 33048e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 33058e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 33068e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 33078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 33088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 33098e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 3310cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 3311f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3312bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 3314cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3315cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3316bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 3317f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 33180654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3319bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3320bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 3321bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 33220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33231369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3324bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 33251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 3326cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3327cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 3330f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 3331f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 3332a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 3338f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 3339f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 3340f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 33418e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 33428e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3347f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3348f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3349f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 33500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3351f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3352f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 3355f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 3356f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3357f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 3359f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 3360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 3364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 33650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3368f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33690951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 3372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 3373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3374f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 33750d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3378f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33790951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 3382f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 3383f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3384f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 3385f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 33860d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 33870d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33880d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3389f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 3390f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 3391f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 33921369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 3393f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3394735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3395735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3396735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 3397735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3398735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3399bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 34000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 34010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3402bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3403bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 34041369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3405bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 34061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 34070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3408bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3409bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 34100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 34110951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3412bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3413bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3414bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 34150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 34161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 34171369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 34181369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 3419f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 3420cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 34210654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3422cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3423a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3424bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3425f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 34264943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3427735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3428cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3429f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 34300654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 34311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 34321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 34331369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 3434f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 34351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 34361369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 3437735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3438735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 34394943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3440735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 3441735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 3442735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 3443735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3444735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3445bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3446735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 34471369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 344839a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 3449735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 34500654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3451cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3452cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 34531964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 34541964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 34551964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 34561964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 34571964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 34581964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 34611aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 34631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34711aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3475e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3478e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3488e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3494e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3495e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3496e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3502e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 35031aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 350466bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 350566bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3515e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3516e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3517e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3518e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3519e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3520e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3521e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3522e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3523e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3524e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 35251aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 35261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35283c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 3529fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 35301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 35371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 35431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 35511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 35531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35547cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 35557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 3561fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35655412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 35707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 35727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 35757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 35767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 35777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 35827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 35907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 35917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 35925412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 35937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 35957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 35967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 35997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 36007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 36017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3602baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3603baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3604baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3605baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 36067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 36077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 36087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 36097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 36107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 36117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 36127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 36137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 36147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 36157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 36167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 36187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3639baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3640baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3641baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3642baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3643baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3657baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3658baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3659baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3660baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3661baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3662baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3663baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3664baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3666baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 36677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 36687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 36697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 36707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 36718e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 36727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 36737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 36747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3675baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3676baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3677baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3678baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3679baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3680baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3681baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3682baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3683baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3684baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3685baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3686baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3687baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3688baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3689baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3690baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3691baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3692baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3693baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3694baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3695baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3696baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3697baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3698baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3699baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3700baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3701baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3708e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3709e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3711e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3712e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3716e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3717e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3718e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3719e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3720e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3721e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3722e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3723e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3724e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3725e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3726e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3727e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3728e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3729e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3730e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3731e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3732e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3733e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3734e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3735e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3736e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3737e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3738e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 37398e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 37408e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3741e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3742e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3743e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3744e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3745e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3746e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 37477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 37487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 37491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 37501964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 37511964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 37521964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 3753fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 37541964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 37551964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 37561964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 37571964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 37581964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 37591964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 37602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) { 37612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan // Return immediately if scan interval is 0. 37632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(0, &e); 37642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 37652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) { 37692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(1); 37732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, 37742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000)); 37752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37772d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37782d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) { 37792d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37802d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37812d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37822d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(0); 37832d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000)); 37842d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37852d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37862d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3787bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3788f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3789bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3790bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3791bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3792bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3793fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore args; 3794bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3795bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3796bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3797bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3798bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3799bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3800bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3801bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 38027fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 3803fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu args.SetUint(WPASupplicant::kInterfacePropertyDepth, kDepth); 3804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3805bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3806bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3807bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3808bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3809bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3810bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 3811fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu args.SetString(WPASupplicant::kInterfacePropertySubject, kSubject); 3812bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3813bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3814db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3815db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 38163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) { 38173cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanFailedTask if scan failed. 38183cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 38193cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, 38203cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds)); 38213cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(false); 38223cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_FALSE(ScanFailedCallbackIsCancelled()); 38233cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 38243cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed 38253cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // callback if has been dispatched. 38263cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)); 38273cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(true); 38283cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 38293cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 38303cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 3831db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 383211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3833db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3834db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3835735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3836735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3837735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3838735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3839db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3840db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3841db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3842f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3843db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3844735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3845db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3846735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 38470951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3848735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3849db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3850735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3851735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3852735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 38530d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 38540d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38550d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3856735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 385711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 38582b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockEapCredentials* eap = new MockEapCredentials(); 385911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 386011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 386111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 386211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 386311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 386411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 386511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 386611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 386711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 38680d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 38690d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38700d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 387111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 387211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 387311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 387411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 387511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 387611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 387711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 387811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 38790d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 388011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 388111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 388211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 388311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 388411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3885bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3886bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3887c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3888c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3889c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3890c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3891c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3892c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3893c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3894c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3895c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3896c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3897c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3898c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 39036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 39047fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 39056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 39076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 39096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 39106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 39116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 39126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 39136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 39146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 39156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 39166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 39176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 39186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 39196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 39206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 39216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 39236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 39246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 39256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 39266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 39276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 39296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 39306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 39316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 39326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 39336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 39346d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 39357347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 39367347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 39376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39385581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 39392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get(); 39405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 39425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 3943fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 39485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 3949fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3950fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3951fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 3952fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 39555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 39585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 3959fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3960fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3961fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)), 3962fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3963fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3964fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)), 3965fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3966fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3967fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3968fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelExcessive)), 3969fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3970fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3971fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3972fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelExcessive)), 3973fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3974fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3975fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3976fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelMsgDump)), 3977fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3979fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3980fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelMsgDump)), 3981fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3982fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3983fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3984fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelWarning)), 3985fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3986fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3987fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3988fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelWarning)), 3989fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 40005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 40015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 40025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 4003fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 4004fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 4005fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 4006fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 40070654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 40085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 40095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 40105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 40115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 40125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 40135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 4014fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 4015fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 4016fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 4017fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 40180654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 40195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 40205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 40215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 40225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 40235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 40245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 4025fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 4026fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 4027fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 4028fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 4029fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 4030fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 4031fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 40325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 40335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 40345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 40355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 40365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 4037fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 40385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 40395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 40405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 40415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 40425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 40435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 404450cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 404550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 404650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 404750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 404850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 4049bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 4050bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 4051bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 4052bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 4053bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4054bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40557fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 4056bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4057bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4058bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4059bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4060bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4061bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4062bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4063bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4064bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 4065bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4066bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40677fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 4068bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4069bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4070bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4071bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4072bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4073bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4074bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4075bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4076bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 4077bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4078bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 4079bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 4080bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4081bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4082bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 4083bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 40840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 40850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40860cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 40879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 4089a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4090a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4091a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4092a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4093a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 40967de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 40970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 40980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 41010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 41030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41040cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 41059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 41060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 4107fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 41089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 41099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 41109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 41110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 41140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 41180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 41200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 41210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 41220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 41240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 41260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41270cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 41289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 41290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 4130fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 41319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 41329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 41330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 41360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 41400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 41420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 41430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 41440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 41460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 41480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 41509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4151df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 41529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 41539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 4154df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4155df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 4156a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4157a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 4158a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 41599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4160df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4162df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 4165df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 4166df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 4167df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4168df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4170df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4172b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 4173b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4174b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 4175df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 4176b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 4177b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 4181df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4182a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4183df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4184b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 4185b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 4186b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 4187b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4188df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 4192df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4193a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4194df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4195df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4196df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 4198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 42010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 4202df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 42039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4204df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4205df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 4206a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4207a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 4209fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 4211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4212df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 4213a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4214a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 42159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4219df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 4220df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 4221df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 4222fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 42260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 4227df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4228a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4229a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 4230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 42339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4234df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4235a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4236fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)). 4237fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu WillOnce(Return(false)); 4238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4241f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 4242f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4243a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 4244df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 4245df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4249df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 42500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 42510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 42520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 42549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4255df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 4257df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 4258a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4259a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4260f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 4262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 4265a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4266df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 4270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4273df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 4274df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 4275f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 4276a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 4277a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 42782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 4279df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 4280a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 4281a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4282a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4283a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4284df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 4285df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 4286a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4287df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4288df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 4289a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4290df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4291df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 4292fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 4293a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4294df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4295df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4296df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4297df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 4298df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4299df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 4300df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 4301fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", &endpoint, &bss_path); 4302df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4303df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 4304a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 4305df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 4306df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 4307df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4308df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4309df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4310df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4311df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 43123bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 43133bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 4314fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 43153bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 43163bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 43173bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 43182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 43193bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 43203bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 43213bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 43223bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 43237de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 43243bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 43253bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 43263bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 43273bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 43282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 43292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 43302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 43322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 43332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 43342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 43352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 43362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 43372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 43392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 43402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 43442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 43452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 43472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 43482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 43492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 43502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 43512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 43522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 43542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 43552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 4358618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, TDLSDiscoverResponse) { 4359618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu const char kPeer[] = "peer"; 43602b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>(); 4361618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu SetTDLSManager(tdls_manager); 43623c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 4363618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_CALL(*tdls_manager, OnDiscoverResponseReceived(kPeer)); 4364618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu TDLSDiscoverResponse(kPeer); 4365618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu Mock::VerifyAndClearExpectations(tdls_manager); 4366618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu} 4367c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4368618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, PerformTDLSOperation) { 4369618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu const char kPeerMac[] = "00:11:22:33:44:55"; 43702b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>(); 4371618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu SetTDLSManager(tdls_manager); 4372618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu 4373618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu Error error; 437462abf31989c52dc1e4ee5aae71664ba81d6fe2dbPeter Qiu // No address resolution is performed since MAC address is provided. 4375618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_CALL(*tdls_manager, 4376618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu PerformOperation(kPeerMac, kTDLSStatusOperation, &error)) 4377618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu .WillOnce(Return(kTDLSConnectedState)); 4378618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_EQ(kTDLSConnectedState, 4379618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu PerformTDLSOperation(kTDLSStatusOperation, kPeerMac, &error)); 4380618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_TRUE(error.IsSuccess()); 4381c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4382c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 43833946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 4384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage new_wiphy_message; 4385b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4386b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart new_wiphy_message.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 43873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 4388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_)); 4389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex)); 4390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->clear(); 43913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 4392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies), 4393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->size()); 4394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) { 4395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(GetAllScanFrequencies()->find(freq) != 4396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->end()); 4397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 43983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 43993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 44003946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 44013946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 44023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 44033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 44043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 44053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 44063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 44073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 44083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 44093c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4410787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4411787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4412787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 44134bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 4414787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4415787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4416787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4417787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4418787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4419787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4420787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4421787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4422787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 44233c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 44243c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 44253c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 44263c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 44273c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 44283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4429787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4430787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4431787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4432787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4433787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 443414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(true); 4435c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4436c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4437d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 44384c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4439787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 444014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 444114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(false); 444214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan EXPECT_CALL(*wake_on_wifi_, 444314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)) 444414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan .Times(0); 44454c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess))); 444614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnBeforeSuspend(); 4447787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4448787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4449787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 445014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(true); 4451787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4452d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 44534c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4454787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 445514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 445614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(false); 445714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan EXPECT_CALL(*wake_on_wifi_, 445814ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)) 445914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan .Times(0); 44604c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess))); 446114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnDarkResume(); 44623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 44653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 44663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 44673fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 44683fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 44693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 4470fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path1(kNetworkRpcId1); 4471fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path2(kNetworkRpcId2); 44723fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 44733fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 44743fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 44753fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 44763fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 44773fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 44783fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 44793fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44803fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44815d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) { 44825d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 44835d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Device::ScanType scan_type = Device::kFullScan; 44845d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 44855d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 44865d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 44875d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 44885d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 44895d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan scan_type = Device::kProgressiveScan; 44905d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 44915d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 44925d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 44935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan} 44945d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 44953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 44963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 44973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 44983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 44993fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 45003fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 45013fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 45023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 45033fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 45053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 45063fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 45075d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 45083fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45093fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 45103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) { 45135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 45144b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan StartWiFi(); 45155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 45163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 45175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 45185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 45195d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 45205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)); 45215d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 45225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 45235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_TRUE(manager()->suppress_autoconnect()); 45243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45253fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) { 45275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 45283fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 45295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 45305d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SetPendingService(service); 45315d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 45325d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 45333fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL( 45355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan log, 45365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 45375d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 45385d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 45395d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 45405d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)).Times(0); 45415d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0); 45425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 45435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 45443fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45453fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) { 4547381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan ScopedMockLog log; 45485d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45495d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 45505d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 4551381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_CALL(netlink_manager_, 4552381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4553381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan TriggerScanMessage::kCommand), 4554381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan _, _, _)); 45555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45565d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 45575d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(0); 45585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 45595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4561381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan} 4562381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan 45635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) { 45645d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 45655d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45665d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 45675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs = {1}; 45683fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 45693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 45703fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 45713fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 45725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 45745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(1); 45755d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 45765d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45775d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4578787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4579787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4580050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) { 4581050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // This test essentially performs ReportBSS(), but ensures that the 4582050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // WiFi object successfully dispatches events in order. 4583050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart StartWiFi(); 4584050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4585050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss0", 4586050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0, 4587050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4588050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4589050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss1", 4590050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0, 4591050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4592050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSRemoved("bss0"); 4593050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4594050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss2", 4595050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0, 4596050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4597050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4598050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00"); 4599050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 4600050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 4601050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4602050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart InSequence seq; 4603050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))); 4604050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))); 4605050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiServiceRefPtr null_service; 4606050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0))) 4607050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart .WillOnce(Return(null_service)); 4608050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))); 4609050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart dispatcher_.DispatchPendingEvents(); 4610050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 4611050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 46122b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap(); 4613050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_EQ(2, endpoints_by_rpcid.size()); 4614050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 4615050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4616235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) { 4617235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag 4618235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // for having the wiphy index is set by ParseWiphyIndex. 4619235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex); 4620235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4621b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4622b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4623235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(ParseWiphyIndex(msg)); 4624235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex); 4625235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4626235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4627235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) { 4628235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan ScopedMockLog log; 4629235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ 4630235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // U32 attribute, so that this message no longer contains a wiphy_index to be 4631235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // parsed. 4632235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4633b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 46342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart struct nlattr* nl80211_attr_wiphy = reinterpret_cast<struct nlattr*>( 4635b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart &packet.GetMutablePayload()->GetData()[ 4636b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kNewWiphyNlMsg_Nl80211AttrWiphyOffset]); 4637235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ; 4638b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4639235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4640235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 4641235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY")); 4642235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_FALSE(ParseWiphyIndex(msg)); 4643235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0); 4644235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4645235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4646d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) { 4647d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4648d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4649b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet( 4650b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kActiveScanTriggerNlMsg, sizeof(kActiveScanTriggerNlMsg)); 4651b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4652d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true)); 4653d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4654d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4655d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4656d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) { 4657d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4658d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4659b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet( 4660b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kPassiveScanTriggerNlMsg, sizeof(kPassiveScanTriggerNlMsg)); 4661b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4662d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false)); 4663d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4664d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4665d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4666853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4667