wifi_unittest.cc revision e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0
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> 105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 11f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1611c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 18a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h> 19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h> 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 24675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_config.h" 25675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_provider.h" 26125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h" 2726b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 29397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h" 307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 31b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 32853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 35c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 3611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 37e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 38687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 393c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 40cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 412ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 423426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 4310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 44a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 4502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h" 468d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 4702e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h" 488d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h" 498d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h" 5002e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h" 51b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart#include "shill/net/netlink_packet.h" 5202e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h" 5302e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h" 54dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 55853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 56da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h" 57da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h" 58da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h" 59da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h" 60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h" 61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h" 6285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 63e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu#include "shill/test_event_dispatcher.h" 64af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 65d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h" 66d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h" 67618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu#include "shill/wifi/mock_tdls_manager.h" 68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h" 69d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h" 70d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h" 71d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h" 72d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h" 73d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h" 74d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h" 75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 760e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 77a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 81ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr; 82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 853c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 87a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 88cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 91b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 92549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 98dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 99d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 10011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 102af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew; 103ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 104ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 106a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 108853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 120c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234; 121235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 122235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi 123235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// capabilities of a NIC with wiphy index |kNewWiphyNlMsg_WiphyIndex| which 124235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// supports operating bands with the frequencies specified in 125235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// |kNewWiphyNlMsg_UniqueFrequencies|. 126235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint8_t kNewWiphyNlMsg[] = { 127235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x68, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 128235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xf6, 0x31, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 129235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30, 130235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 131235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00, 132235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff, 133235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00, 134235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x00, 0x00, 135235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 136235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd1, 0x08, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 137235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00, 138235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x8b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x18, 0x00, 0x39, 0x00, 139235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 0x02, 0xac, 0x0f, 0x00, 140235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0xac, 0x0f, 0x00, 0x06, 0xac, 0x0f, 0x00, 0x05, 0x00, 0x56, 0x00, 141235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00, 142235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x03, 0x00, 0x00, 0x00, 143235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x69, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6a, 0x00, 144235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00, 145235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 146235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 147235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x09, 0x00, 0x50, 0x05, 0x16, 0x00, 0xf8, 0x01, 0x00, 0x00, 148235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 150235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 151235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00, 152235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00, 153235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 154235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 155235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 156235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 157235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00, 158235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 159235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 160235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 161235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 162235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00, 163235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 164235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 165235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 166235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 167235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00, 168235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00, 169235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 170235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 171235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa3, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 172235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 173235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 174235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 175235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb4, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 176235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 177235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 178235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 179235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x00, 180235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 181235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00, 182235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 183235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 184235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 185235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 186235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00, 187235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00, 188235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0b, 0x00, 189235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x54, 0x03, 0x01, 0x00, 190235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 191235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 192235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 193235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0x00, 194235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00, 195235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 196235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 197235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 198235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00, 199235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 200235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 201235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 202235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x8c, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 203235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 204235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 0x00, 0x00, 205235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 206235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 207235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 208235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 209235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 210235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc8, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 211235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 212235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 0x15, 0x00, 0x00, 213235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 214235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x09, 0x00, 215235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 216235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 217235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 218235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa4, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 219235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 220235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 0x00, 0x00, 221235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 222235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0c, 0x00, 223235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 224235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 225235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 226235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 227235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 228235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00, 229235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 230235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 231235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 232235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 233235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 234235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 235235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 236235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00, 237235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 238235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00, 239235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 240235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 241235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00, 242235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 243235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x16, 0x00, 0x00, 244235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 245235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00, 246235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 247235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00, 248235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 249235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 250235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc1, 0x16, 0x00, 0x00, 251235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 252235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 253235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 254235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00, 255235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 256235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 257235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 258235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 259235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 260235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xd4, 0x00, 0x32, 0x00, 261235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 262235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 263235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 264235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x19, 0x00, 0x00, 0x00, 265235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 266235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x00, 267235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 268235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x00, 0x00, 269235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 270235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x43, 0x00, 0x00, 0x00, 271235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 272235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x42, 0x00, 0x00, 0x00, 273235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x13, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 274235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x00, 275235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x16, 0x00, 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 276235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 277235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x19, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 278235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x88, 0x13, 0x00, 0x00, 279235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x6c, 0x00, 0xac, 0x03, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00, 280235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 281235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 282235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 283235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 284235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 285235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 286235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 287235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 288235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 289235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 290235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 291235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 292235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 293235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 294235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 295235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 296235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 297235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 298235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 299235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 300235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 301235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 302235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 303235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 309235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 310235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 311235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 315235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 316235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 317235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 318235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 319235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00, 325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00, 336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 344235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00, 347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 351235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 352235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x14, 0x01, 0x64, 0x00, 358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 360235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 367235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 368235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 372235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 373235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 374235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 375235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00, 376235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 377235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 378235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 379235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 380235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00, 381235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x50, 0x00, 0x78, 0x00, 382235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x4c, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00, 383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00, 385235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x18, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x0c, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x09, 0x00, 387235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00, 389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1e, 0x00, 0x94, 0x00, 0x42, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 391235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint32_t kNewWiphyNlMsg_WiphyIndex = 2; 393b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewartconst int kNewWiphyNlMsg_Nl80211AttrWiphyOffset = 4; 394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint16_t kNewWiphyNlMsg_UniqueFrequencies[] = { 395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2462, 2467, 2472, 2484, 5180, 5200, 5220, 5240, 5260, 5280, 397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 398235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825}; 3995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 400d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint32_t kScanTriggerMsgWiphyIndex = 0; 401d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kActiveScanTriggerNlMsg[] = { 402d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x44, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 404d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 405d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x2c, 0x00, 407d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 408d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 409d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 410d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 411d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 412d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 413d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 414d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 415d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 416d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 417d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 418d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 419d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 420d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 421d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 422d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 423d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 424d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 425d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 426d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 427d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 428d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 429d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 430d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kPassiveScanTriggerNlMsg[] = { 431d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x40, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 432d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 433d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 434d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 435d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x04, 0x00, 0x2d, 0x00, 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00, 436d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 437d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 438d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00, 439d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 440d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00, 441d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 442d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00, 443d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 444d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00, 445d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 446d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00, 447d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 448d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00, 449d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 450d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00, 451d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 452d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00, 453d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00, 454d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00, 455d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00, 456d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00, 457d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 458d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 4605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 4613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 462853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 4633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 4640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan : metrics_(nullptr), 4653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal device_( 4663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new WiFi(control_interface(), dispatcher(), &metrics_, 4673946da840142cd386d628c0e879459f8976bd86dmukesh agrawal manager(), "wifi", "", kInterfaceIndex)) { 468853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 4693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 470853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 471853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 4723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMetrics metrics_; 4738abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 474853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 475853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 4763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 477f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 478de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 479853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 480853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 4816bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 482a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 483e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 484e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_TRUE(device_->mutable_store()->SetAnyProperty( 485e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu kBgscanSignalThresholdProperty, PropertyStoreTest::kInt32V, &error)); 486a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 487a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 488e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 489e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_TRUE(device_->mutable_store()->SetAnyProperty( 490e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu kScanIntervalProperty, PropertyStoreTest::kUint16V, &error)); 491a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 492853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 493a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 494e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 495e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_FALSE(device_->mutable_store()->SetAnyProperty( 496e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu kScanningProperty, PropertyStoreTest::kBoolV, &error)); 497e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ASSERT_TRUE(error.IsFailure()); 498e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(Error::kInvalidArguments, error.type()); 499a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 500853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5014d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 502e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 503e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_TRUE(device_->mutable_store()->SetAnyProperty( 504f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 505e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu chromeos::Any(string(WPASupplicant::kNetworkBgscanMethodSimple)), 5064d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5074d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5084d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 5094d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 510e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 511e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_FALSE(device_->mutable_store()->SetAnyProperty( 512f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 513e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu chromeos::Any(string("not a real scan method")), 5144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5154d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 5174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 5184a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 5190654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 5208abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 5214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 5234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 524e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 525e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 526f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5280654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 5298abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 530e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu Error error; 531e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_TRUE(device_->mutable_store()->SetAnyProperty( 532f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 533e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu chromeos::Any(string(WPASupplicant::kNetworkBgscanMethodLearn)), 5348abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 5350654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 536e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 537f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5380654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 5398abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 540e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_TRUE(device_->mutable_store()->ClearProperty( 541e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu kBgscanMethodProperty, &error)); 542e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 543f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5468abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 5478abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5483c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 5533c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 5543c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 556e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 5573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 55877994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // Note: When this constructor is called (via the initialization lists in the 55977994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // constructors of WiFiMainTest and WiFiTimerTest), |dispatcher| will point to 56077994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // an uninitialized EventDispatcher. Any functions (including constructors in 56177994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // the initialization list) that use the message loop should not be called in 56277994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // this constructor, since the delayed initialization of the message loop can 56377994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // cause concurrency-related bugs. (See crbug.com/509138 for an example.) 5642b363903f38a515001c5edc7202403fcddb15a01Paul Stewart explicit WiFiObjectTest(EventDispatcher* dispatcher) 565e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 5660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan metrics_(nullptr), 5670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan manager_(&control_interface_, nullptr, &metrics_, &glib_), 568e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 569fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_, 570fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan kDeviceName, kDeviceAddress, kInterfaceIndex)), 5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 572fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan mac80211_monitor_(new StrictMock<MockMac80211Monitor>( 573fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold, 574fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan base::Closure(), &metrics_)), 575dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 576af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()), 577af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)), 5780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 579735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 581fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu new NiceMock<MockSupplicantInterfaceProxy>()), 582fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu supplicant_network_proxy_(new NiceMock<MockSupplicantNetworkProxy>()) { 5833946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->mac80211_monitor_.reset(mac80211_monitor_); 584e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu wifi_->supplicant_process_proxy_.reset(supplicant_process_proxy_); 5855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 586e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ON_CALL(*supplicant_process_proxy_, CreateInterface(_, _)) 587fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 588fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 589e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ON_CALL(*supplicant_process_proxy_, GetInterface(_, _)) 590fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 591fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 592fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), AddNetwork(_, _)) 593fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")), 594fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 595fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), Disconnect()) 596fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 597fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), RemoveNetwork(_)) 598fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 599fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_interface_proxy_.get(), Scan(_)) 600fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 601fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ON_CALL(*supplicant_network_proxy_.get(), SetEnabled(_)) 602fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(Return(true)); 603c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 6043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_)) 6053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal .Times(AnyNumber()); 6063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 6078e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu ON_CALL(dhcp_provider_, CreateIPv4Config(_, _, _, _)) 608af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(Return(dhcp_config_)); 609af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true)); 6102d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false)); 611af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan 612e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ON_CALL(control_interface_, CreateSupplicantInterfaceProxy(_, _)) 613af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_)); 614e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ON_CALL(control_interface_, CreateSupplicantBSSProxy(_, _)) 615af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_)); 616e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu ON_CALL(control_interface_, CreateSupplicantNetworkProxy(_)) 617fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillByDefault(ReturnAndReleasePointee(&supplicant_network_proxy_)); 618318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 619ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 620735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 621735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 6222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 6233c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 6245c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 625bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 6265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 6270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 6285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 6305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 6315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 6325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 6335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 6343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6355c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 6373ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 6383ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 639d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 6402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart static_cast<Device*>(wifi_.get())->rtnl_handler_ = &rtnl_handler_; 6415c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal wifi_->set_dhcp_provider(&dhcp_provider_); 6423c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_)); 6432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber()); 644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 64577994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // Must be called here instead of in the constructor so that the destructor 64677994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // of SimpleAlarmTimer will not be invoked before the EventDispatcher is 64777994d69bae79ce07d3830c4f83144503a06b224Samuel Tan // properly constructed (crbug.com/509138). 64877994d69bae79ce07d3830c4f83144503a06b224Samuel Tan InstallMockWakeOnWiFi(); 6495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 6505c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6515c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 6523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 6530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillRepeatedly(Return(nullptr)); 6540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SelectService(nullptr); 655b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 656b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 657b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 6583946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 6593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 6603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 6613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 6620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Stop(nullptr, ResultCallback()); 6630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->set_dhcp_provider(nullptr); 6643ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 6653ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 666d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 667f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 668f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 669549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 670549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 6713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 6720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(false); // Stop(nullptr, ResultCallback()); 673549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 674549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 67517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 6760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 67717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 678c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 6795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 6805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 6815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 6845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 6855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 6865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 6895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 6905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 6915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 7005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<uint16_t> available_frequencies; 7015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 7025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 7035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 7045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 7055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 7065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 7075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 711f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 7120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr); 7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 7145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 716fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan void InstallMockWakeOnWiFi() { 717fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_, 7181897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan &metrics_); 719fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_->wake_on_wifi_.reset(wake_on_wifi_); 720fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan } 721fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan 7225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 7235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 7245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnTriggerScanResponse(const Nl80211Message& message) { 7285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 7295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 731b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 732b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 7332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* reason) { 734b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 735b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 736b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 7379f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 7380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 7390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 7400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 7410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 7427fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRoamThresholdMember(uint16_t threshold) { 743227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 744227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 745227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7467fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetRoamThreshold(uint16_t threshold) { 747227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 748227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 749227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7507fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t GetRoamThreshold() const { 751227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 752227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 753227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 7557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 7567ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 7572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 7583c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 7593c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 760bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 7612b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr& service) 762bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 763bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 764bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 765bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 7662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiEndpointConstRefPtr& endpoint) { 767bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 768bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 769bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 7703c5040174273386868cc8dea8044d22c465885d8Paul Stewart 7713c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 7723c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 7733c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 7743c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 7753c5040174273386868cc8dea8044d22c465885d8Paul Stewart 7762b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EndpointRemovalHandler* MakeEndpointRemovalHandler( 7772b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& service) { 7783c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 7793c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 780b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 782b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 7833c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 7843c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 7853c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 7863c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 7872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char* mode, 7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 7892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* ssid, 7902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* path, 7912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart string* bssid) { 7923c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 7933c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 794a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *ssid = StringPrintf("ssid%d", bss_counter_); 7953c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 796a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *path = StringPrintf("/interface/bss%d", bss_counter_); 797a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_); 7983c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 7993c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 8003c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string& ssid, const string& bssid) { 8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 8053c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8063c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 8072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, const string& bssid, const string& mode) { 8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 809608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu &control_interface_, nullptr, ssid, bssid, mode, 0, 0); 8103c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8113c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 8122b363903f38a515001c5edc7202403fcddb15a01Paul Stewart vector<uint8_t> ssid, const std::string& security) { 8133c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 8163c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 8173c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 8193c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 820f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 8213c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 8233c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8242b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string& security) { 8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 827fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string MakeNewEndpointAndService(int16_t signal_strength, 828fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 829fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode, 830fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu WiFiEndpointRefPtr* endpoint_ptr, 831fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr* service_ptr) { 8323c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 833fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path; 8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8363c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8433c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8493c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 851fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string AddEndpointToService( 8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 8547fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 8552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode, 8562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr) { 8573c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 858fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path; 8593c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8603c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8673c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 8710951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->ConnectTo(service.get()); 8723c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 8740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFrom(service.get()); 8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 876d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein void InitiateDisconnectIfActive(WiFiServiceRefPtr service) { 8770951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFromIfActive(service.get()); 878d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein } 8793c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 880fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& network_path, 8812b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr, 882fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path_ptr) { 8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 885fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path(MakeNewEndpointAndService( 8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 887a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart if (!network_path.empty()) { 888a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 889fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)) 890fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(DoAll(SetArgumentPointee<1>(network_path), Return(true))); 8918e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 8928e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetHT40Enable(network_path, true)); 893a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 894a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 8953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 8963c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 8970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9003c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9053c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9063c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9073c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 909fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& network_path, 9102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint_ptr, 911fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path_ptr) { 9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 913fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 9143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 9153c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 9163c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9173c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9183c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9193c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9213c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 9233c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 9250951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9263c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 928bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 9298e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 9308e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 9313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 932a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 9330654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 9340951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9353c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 939d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 940b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 941b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 942b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 9432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 9442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 9450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 9462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 9470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 9482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 949c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 9502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& GetCurrentService() { 9511590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 9521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 9532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetCurrentService(const WiFiServiceRefPtr& service) { 954bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 955bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 9562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& GetEndpointMap() { 957165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 9583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& GetPendingService() { 9601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 9611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 9622b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetPendingTimeout() { 9632b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 9642b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 9652b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetReconnectTimeoutCallback() { 966446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 967446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 9682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const ServiceRefPtr& GetSelectedService() { 9692ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 9702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 9712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& GetSupplicantBSS() { 9727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 9737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 9742b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetSupplicantBSS(const string& bss) { 9757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 9767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 9771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 9781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 9791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 9802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& GetScanTimer() { 981b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 982b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 9833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 9853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 9862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart SupplicantProcessProxyInterface* GetSupplicantProcessProxy() { 9873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9892b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxyFromWiFi() { 9902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart return dynamic_cast<MockSupplicantInterfaceProxy*>( 9918a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 9923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9933c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 9943c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 9953c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 9963c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 9972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxy() { 9982b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantInterfaceProxy* proxy = GetSupplicantInterfaceProxyFromWiFi(); 9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 10003c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 10012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& GetSupplicantState() { 10027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 10037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 10041caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int GetSupplicantDisconnectReason() { 10051caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein return wifi_->supplicant_disconnect_reason_; 10061caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein } 10072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ClearCachedCredentials(const WiFiService* service) { 1008835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 1009835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 10102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr& endpoint) { 10110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 10120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 1013fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bool RemoveNetwork(const string& network) { 1014381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 1015381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 1016fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore CreateBSSProperties(const string& ssid, 1017fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& bssid, 1018fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu int16_t signal_strength, 1019fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 1020fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode); 1021fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void RemoveBSS(const string& bss_path); 1022fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void ReportBSS(const string& bss_path, 10232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, 10242b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& bssid, 10253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10267fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode); 1028c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 10293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, true); 10303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan } 10313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan void ReportIPConfigCompleteGatewayArpReceived() { 10323c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, false); 1033c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 1034050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1035050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Calls the delayed version of the BSS methods. 1036fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSAdded(const string& bss_path, 1037fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const KeyValueStore& properties) { 1038050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAdded(bss_path, properties); 1039050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1040fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void BSSRemoved(const string& bss_path) { 1041050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSRemoved(bss_path); 1042050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1043050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1044787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void ReportIPv6ConfigComplete() { 1045787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnIPv6ConfigUpdated(); 1046787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1047f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 1048f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 1049f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1050f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 1051f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 1052f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1053f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 1054f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 1055f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 10562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ScanDone(const bool& success) { 10573cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanDone(success); 10583cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10593cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan void ReportScanFailed() { 10603cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanFailedTask(); 10613cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 10635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 10645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 10655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 10665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 10675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 10685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 10695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 1070dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 10713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportCurrentBSSChanged(const string& new_bss) { 10731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 10741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 10752b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportStateChanged(const string& new_state) { 10767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 10777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 10781caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein void ReportDisconnectReasonChanged(int reason) { 10791caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein wifi_->DisconnectReasonChanged(reason); 10801caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein } 10815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 10825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 10835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 10847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 10857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 10867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 10872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportReceivedStationInfo(const Nl80211Message& nl80211_message) { 10887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 10897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 1090baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 10910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 1092baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 10932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetPendingService(const WiFiServiceRefPtr& service) { 1094df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 1095cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 109611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 10972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFiServiceRefPtr& service, const string& rpcid) { 109811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 109911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 11003fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan bool RpcIdByServiceIsEmpty() { 11013fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan return wifi_->rpcid_by_service_.empty(); 11023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetScanInterval(uint16_t interval_seconds, Error* error) { 1104bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 1105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 1106e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 11070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 1108e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 11092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1111a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 1119a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 1122a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 11235412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 11252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 11260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 1127125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 1128e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu // Mimic the callback from |supplicant_process_proxy_|. 1129e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu wifi_->OnSupplicantAppear(); 11303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 11312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 11322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 11332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11342f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 1135787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnAfterResume()); 11362f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 11372f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 11382f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 1139fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 1140fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1141fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 11422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 1143787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnDarkResume() { 1144787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ResultCallback callback( 1145787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1146787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnDarkResume(callback); 1147787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 11483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void RemoveSupplicantNetworks() { 11493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->RemoveSupplicantNetworks(); 11503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11515d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void InitiateScan(Device::ScanType scan_type) { 11525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScan(scan_type); 11533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void InitiateScanInDarkResume(const WiFi::FreqSet& freqs) { 11555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScanInDarkResume(freqs); 1156381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan } 11572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TriggerPassiveScan(const WiFi::FreqSet& freqs) { 11585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->TriggerPassiveScan(freqs); 11593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11602b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 1161e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu wifi_->OnSupplicantAppear(); 11622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 11632b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 1165e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu wifi_->OnSupplicantVanish(); 11662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 11672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 11692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 11702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 1171687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 1172687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 1173687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 11742b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetIPConfig(const IPConfigRefPtr& ipconfig) { 1175687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 1176687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 11772b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanMethod(const string& method) { 1178fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Error error; 1179fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return wifi_->mutable_store()->SetAnyProperty(kBgscanMethodProperty, 1180fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu chromeos::Any(method), 1181fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu &error); 11824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 11834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 11842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void AppendBgscan(WiFiService* service, 1185fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore* service_params) { 11864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 11874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 11884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1189fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu void ReportCertification(const KeyValueStore& properties) { 1190bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 1191bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 119210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 11932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void ReportEAPEvent(const string& status, const string& parameter) { 1194db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 1195db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 1196db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 1197e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 1198e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 1199e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 1200e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 12012d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void SetFastScansRemaining(int num) { 12022d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->fast_scans_remaining_ = num; 12032d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 12042d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 12051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 12061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 12071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 12101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 12111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetLinkMonitor(LinkMonitor* link_monitor) { 12143c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 12153c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 12172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr& service, 12182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart Service::ConnectFailure* failure) { 12191369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 12201369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 12211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 12223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 12233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 12243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 12268e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 12278e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 12288e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 12298e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 12302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanShortInterval(const uint16_t& interval, Error* error) { 1231bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 1232bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1233bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool SetBgscanSignalThreshold(const int32_t& threshold, Error* error) { 1235bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 1236bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1237bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12382b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void SetTDLSManager(TDLSManager* tdls_manager) { 1239618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu wifi_->tdls_manager_.reset(tdls_manager); 1240df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1241df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 12422b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void TDLSDiscoverResponse(const string& peer_address) { 1243618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu wifi_->TDLSDiscoverResponse(peer_address); 1244df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1245df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1246618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu string PerformTDLSOperation( 12472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& operation, const string& peer, Error* error) { 1248c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 1249c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 1250c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 1251df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 1252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 1253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 1254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 12552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnNewWiphy(const Nl80211Message& new_wiphy_message) { 12563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 12573946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 12583946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 1259787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 1260787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 1261787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1262787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 12632b363903f38a515001c5edc7202403fcddb15a01Paul Stewart NiceMockControl* control_interface() { 126410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 126510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 126610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 12672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMetrics* metrics() { 126885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 126985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 127085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 12712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockManager* manager() { 12723239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 12733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1274d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 12752b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockDeviceInfo* device_info() { 1276d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 1277d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1278d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 12792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockDHCPProvider* dhcp_provider() { 1280d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 1281d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1282d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 12833239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 12843239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 12853239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 12863239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 12872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWiFiProvider* wifi_provider() { 12883c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 12893c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 12903c5040174273386868cc8dea8044d22c465885d8Paul Stewart 12912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMac80211Monitor* mac80211_monitor() { 12923946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 12933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 12943946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 12951964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 12961964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 12971964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 12981964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 12992d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void StartScanTimer() { 13002d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->StartScanTimer(); 13012d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 13022d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 13032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart bool ParseWiphyIndex(const Nl80211Message& nl80211_message) { 1304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return wifi_->ParseWiphyIndex(nl80211_message); 1305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; } 1308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1309d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; } 1310d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13112b363903f38a515001c5edc7202403fcddb15a01Paul Stewart std::set<uint16_t>* GetAllScanFrequencies() { 1312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return &wifi_->all_scan_frequencies_; 1313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 13152b363903f38a515001c5edc7202403fcddb15a01Paul Stewart void OnScanStarted(const NetlinkMessage& netlink_message) { 1316d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan wifi_->OnScanStarted(netlink_message); 1317d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan } 1318d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13193cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan bool ScanFailedCallbackIsCancelled() { 13203cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan return wifi_->scan_failed_callback_.IsCancelled(); 13213cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 13223cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 132314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan void SetWiFiEnabled(bool enabled) { 132414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan wifi_->enabled_ = enabled; 132514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan } 132614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 13272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MOCK_METHOD1(SuspendCallback, void(const Error& error)); 1328fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 13292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart EventDispatcher* event_dispatcher_; 13302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockScanSession* scan_session_; // Owned by |wifi_|. 13312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockWakeOnWiFi* wake_on_wifi_; // Owned by |wifi_|. 13325c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 13335c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 13343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1336dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 13373426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 1338f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 13392ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 1340c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 13413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 13423c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 13433c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 13442b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockMac80211Monitor* mac80211_monitor_; // Owned by |wifi_|. 13453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 13473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 13483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 13493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 1350626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 13513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 13523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 1353446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 1354446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 13557fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 13563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1357e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu MockSupplicantProcessProxy* supplicant_process_proxy_; 1358ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1359f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1360f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 1361735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1362735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1363735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 13642b363903f38a515001c5edc7202403fcddb15a01Paul Stewart DeviceMockAdaptor* adaptor_; 13652b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantEAPStateHandler* eap_state_handler_; 1366bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1369ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1370fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu unique_ptr<MockSupplicantNetworkProxy> supplicant_network_proxy_; 13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 13723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1373e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1374e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1375e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1376e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1377446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1378446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 13797fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 13803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1381fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::RemoveBSS(const string& bss_path) { 1382b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1383261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1384261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1385fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuKeyValueStore WiFiObjectTest::CreateBSSProperties( 13862b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& ssid, 13872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const string& bssid, 1388050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1389050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 13902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const char* mode) { 1391fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore bss_properties; 1392fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint8s("SSID", vector<uint8_t>(ssid.begin(), ssid.end())); 13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 13943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 13953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1396a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 1398fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint8s("BSSID", bssid_bytes); 13993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 1400fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetInt16(WPASupplicant::kBSSPropertySignal, signal_strength); 1401fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetUint16(WPASupplicant::kBSSPropertyFrequency, frequency); 1402fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu bss_properties.SetString(WPASupplicant::kBSSPropertyMode, mode); 1403050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1404050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart return bss_properties; 1405050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 1406050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1407fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::ReportBSS(const string& bss_path, 1408fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& ssid, 1409fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const string& bssid, 1410fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu int16_t signal_strength, 1411fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu uint16_t frequency, 1412fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu const char* mode) { 1413050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAddedTask( 1414050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bss_path, 1415050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode)); 14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1418e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1419e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1420e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1421e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1422e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1423e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1424a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1425a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1426a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1427a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 14282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1429a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1430a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 14319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 14329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 14339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 14349f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1436f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1437a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 14402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 14419f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 14429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14439f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 14449f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14459f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 14472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart WiFiEndpointRefPtr* endpoint, 1448fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string* bss_path) { 14499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 14509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 14519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 14529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1454fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string dummy_bss_path; 14559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 14569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 14579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1459a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1460a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 14619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 1462fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", endpoint, bss_path); 14639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 14649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 14669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 14689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1471a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1473a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1474a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1477a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 14782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1479f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1480a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1481a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1482a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1483a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1484a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1485a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1486a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1487f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1488a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1489a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1490a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1491a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1492a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1493a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1494a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1495a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1496a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1497a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1498a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1499a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1500a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1501a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1502a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1503a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1504a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1506a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1507a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1508a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1509a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1510a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1511e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EventDispatcherForTest dispatcher_; 1512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 15143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 15150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 15180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15212b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 15222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 15232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1525227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1526227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1527227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1528227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1529227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1530227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1531227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1532227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1533227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1534227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1535227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1536227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1537227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1538227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1539227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1540227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1541227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1542e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan 1543e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan // Do not set supplicant's roam threshold property immediately if the 1544e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan // current WiFi service has its own roam threshold property set. 1545e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1546e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan service->roam_threshold_db_set_ = true; 1547e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan SetCurrentService(service); 1548e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(_)).Times(0); 1549e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1550e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan EXPECT_EQ(kRoamThreshold16, GetRoamThreshold()); 1551227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1552227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15532b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 1554e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 1557e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1559227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1560227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1561227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1562227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1563227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1564227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1565227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1566227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 1568e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15699cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 15709cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 15719cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 15729cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 15739cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 15749cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 15752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15772b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 1578e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 1581e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15829cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 15839cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 15849cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 15859cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 15869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 15872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15882b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15892b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 1590e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 1593e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 15952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 15972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 15982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 15992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16012b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 16022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1608549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 16093c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16103c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16113c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 1612fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr)); 1613549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1614549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1615c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1616549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1617549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1618549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1619ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16203c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16223c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1625549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1626549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 16270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1628549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1629549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 16305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 16315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 1632fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)); 1633fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)) 16343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 1635fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1636b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 16373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 16393239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 16413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 1644fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)); 1645fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)) 16465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 1647fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 16485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 16495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 16535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1655835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1657fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 16580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 16600951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1661835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1662835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 16630427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 16640427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 16650427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 16660427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 16670427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 16680427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 16690427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1670381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1671fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 1672381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1674fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(true)); 1675381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1676381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1677381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1678ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1679316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1680316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1681316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1682316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 16838e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true)) 1684316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 16852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 1686316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1687316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1688316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1689316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1690316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1691316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1692316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 16938e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true)) 1694ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 16952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 16960951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1697316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1698316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1699316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1700316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 17018e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, false)) 1702316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 17032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const_cast<WiFi*>(wifi().get())->AcquireIPConfig(); 1704ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1705ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1706fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuTEST_F(WiFiMainTest, RemoveNetworkFailed) { 1707fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string network = "/test/path"; 17083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1709fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1710381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1711381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1712381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1713381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 17145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 17155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 1716fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)) 17173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 1718fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 1719fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _)); 17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 17213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17223239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 17233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 1726fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _)) 17275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 1728fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 17295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 17305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 17353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 17363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 17373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 17412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 17422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 17433c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 17462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1747f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 17482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 17492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 17502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1752c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 17532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1754c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1755c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17560951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 17572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 17592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 17602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 17612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 17622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 17642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 17652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1766c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1767c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17680951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 17692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1770c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 17712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 17722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 17730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1774c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 17753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1776c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 17772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1778c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1779c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17800951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 17812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1782c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 17832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 17842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 17852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 17862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1787c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1788c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17890951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 17902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 17922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 17932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1794c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1795c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 17965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 17972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 17982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 17992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1801f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 18042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 18065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18090951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 18202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18220951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 18262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 18295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 18305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 18312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 18392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 18405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 18412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18483cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) { 18493cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan StartScan(WiFi::kScanMethodFull); 18503cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ExpectScanStop(); 18513cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 18523cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ReportScanFailed(); 18533cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18543cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 18553cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 18565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 18575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 18583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1859ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1860ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 18613c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18625c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1863ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1864ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 18652f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1866ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1867ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1868ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 18695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 18705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 18715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 18725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 18755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 18765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 18780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 18790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 18800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 18815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 18835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 18843a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 18853a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 18863a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 18873a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18883a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 18893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 18903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 18913a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 18923a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 18933a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 18943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 18953a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 18963a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 18973a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18983a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 18993a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 19003a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 19015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 19025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1904ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1905ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19063c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1907ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1908ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19092f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1910ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1911ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1912ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 19145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 19225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 19265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1928ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1929ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19303c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 1932fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 19333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 19343c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 19353ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1937ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19382f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1939ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1940ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1941ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 19435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 1948fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 19495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 19505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 19515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 19535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 1954df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 19555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 19565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19598e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 19608e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 1961fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 19628e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 19638e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 19648e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 19658e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19668e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 19678e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 19683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 19693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 19703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 1971e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 19723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1973e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 19743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1975e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 19763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 1977e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 19787fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 1979e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 1980e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 1981e41a72d0737488d561a4158019409d5785dad61bThieu Le 19822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap(); 1983e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 1984e41a72d0737488d561a4158019409d5785dad61bThieu Le 1985e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 1986e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 1987e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 1988e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 1989e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 1990e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 1991e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 1992e41a72d0737488d561a4158019409d5785dad61bThieu Le } 1993e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 1994e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 1995e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 1996e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 19973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 19983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 19993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 20003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 20013c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 20023c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20033c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 20043c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 20053c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 20063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 20073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 20083c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20103c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 20113c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 20123c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 20133c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 2014381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan manager()->set_suppress_autoconnect(true); 20153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 2016381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 20173c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 20183c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 2020b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 20210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 2022e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 2023b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 2024e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 2025e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 20268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 20298a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20303c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2031fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 20323c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2033fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, &bss_path)); 2034ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20353c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20398a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2041261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 2042261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 2043261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 2044261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2046fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2048fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, &bss_path)); 20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 20533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 20543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2055835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 2056835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 2057fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath = "/test/path"; 20580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 2059835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2060835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2062835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 20660654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2067835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2068835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 2069a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 2070a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 2071fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).Times(0); 20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 2073835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 2074835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 2075835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 20760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 20770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 20783c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2079fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 20803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 20813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20824943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 20834943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 20844943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 20854943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 20864943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 20870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 20884943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 20894943822214f823c2437aa32b0376414b3e60388dPeter Qiu 20904943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 20914943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 20924943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 2093fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 20944943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 20954943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20964943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 20973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 20980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 21000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 21040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21053c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 2106fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 21080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 21113c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 21133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 21150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 21163c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 21233c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 21240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 21260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 21270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 21290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21302b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 21310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 21343c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2135fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 21360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21384943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 21420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 21430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 2144835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2145835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 2146ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 2147af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 2148608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu EXPECT_CALL(*control_interface(), 2149e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu CreateSupplicantNetworkProxy(kPath)) 2150af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2151fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true)); 2152735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 21533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 21544943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 21554943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21564943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 21570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 21584943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21594943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 21604943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21614943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 21624943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 2163fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 21640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21654943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21664943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 21674943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21684943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 21694943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 21704943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 21714943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21724943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 2173ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 21744943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 2175608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu EXPECT_CALL(*control_interface(), 2176e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu CreateSupplicantNetworkProxy(kPath)) 21774943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2178fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true)); 21794943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 21804943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 21814943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 21824943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21830654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 21840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 21853c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 2188c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 21893c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2190fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 21910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2193fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(false)); 21943c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2195c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 2196c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 2197c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 2198c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 21990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 2201c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 2202c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 22030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 22040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 2205fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2207fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService("", 22080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 22120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 22130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 22140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22162b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 22174943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22184943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22194943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 22204943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22212b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 22222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 22231aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 22241aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 2225fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 22260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22271aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22281aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 22291aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 22301aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 22311aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22321aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22331aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 22341aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 22351aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22361aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 22371aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 22380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 22401aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22411aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 22421aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22431aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 22441aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 2245d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 2246d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2247fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2249d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2250d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2251d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2252d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2253d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2254d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2255d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 2256d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2257d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2258d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 22590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2260d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2261d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2262d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2263d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2264d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 2265d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2266fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2268d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2269fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service1(SetupConnectedService("", 22700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2271d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2272d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2273d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2274d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2275d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2276d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 2277d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 2278d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2279d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 2280d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2281d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2282d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 22830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2284d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2285d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2286d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2287d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2288d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 2289d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2290fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService("", 22910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 2293d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 2294d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2295d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2296d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2297d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2298d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2299d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 2300d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2301d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2302d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 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 231117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 23129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 23132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& pending_timeout = GetPendingTimeout(); 231417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 23159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 23169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 231744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 231844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 231917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 232017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 232117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 23220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 23230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 23240d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 232517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 232617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 232717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 232833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 232917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 23300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 233144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 2332a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 233344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2334a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 2335a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2336a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 23370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 23380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 23390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 234017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 23410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 234233a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 234333a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 23440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 23450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 23460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 23470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 234817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 234917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 235017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 23512b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 23522b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const base::CancelableClosure& pending_timeout = GetPendingTimeout(); 23532b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 23543c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2355fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 23562b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 23572b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 235817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 235917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 23600d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 23610d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 23620d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 236317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 236417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 236517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 236617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 23673c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 23680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 23690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 23700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 23710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 23720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 23733c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 23740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 23753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 23760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 23770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 23780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 23790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 23803c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 2381fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 23820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 23833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2384fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillRepeatedly(Return(false)); 23853c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 23860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 23870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 23880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 23890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 23905c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2391c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 23923c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 2393fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string kPath("/fake/path"); 23940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 23960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 23973c5040174273386868cc8dea8044d22c465885d8Paul Stewart 23983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 23990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24003c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 24010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2403c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2404b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2405c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 24065c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 24075c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2408549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 24093c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24113c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 2412fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr)); 2413ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 24143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 24153c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 24163c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 24173c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 24183c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2419549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 24200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2421549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2422549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2423446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24253c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2426fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 24281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24290654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24310654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24330654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2435446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 24361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24370654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 24421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2443446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2444446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 2445fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu 24465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2447fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu if (!arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs)) { 2448ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2449ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2450ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2451fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu ByteArrays ssids = arg.GetByteArrays(WPASupplicant::kPropertyScanSSIDs); 2452ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2453ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2454ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2455ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 24583c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 2460fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return !arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs); 2461ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2462ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 24635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 24645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 24663c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 24673c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 24683c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24693c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 24715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 24725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 24743c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 24753c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 24775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 24785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 24795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 24805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 24815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 24825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 24835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 24845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 24855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 24865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 24875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2488ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 24895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 24905412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 24915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 24925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 24935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 24945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 24955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 24965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 24975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 24985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 24995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 25005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 25065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25113c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 25125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25145412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2515ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2516ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2517ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2518fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2519fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2520fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2521fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2522fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 25233c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 25245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2525fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2526fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2527fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2528fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2529fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2530fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2531fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 25321e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 25331e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 25341e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 25351e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 25361e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 25371e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 2538fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(false)); 25391e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 25401e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 25411e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 25421e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 25431e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 25445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 25509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 25517de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 25552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 25565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 25585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 25595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2561f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2562df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2563df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2564df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2565f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 25665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 25675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 25695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 25705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 25715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 25725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 25735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 25755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 25785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 25795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 25805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 25815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 258244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 258344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 258444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 258544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 25865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 25879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 25885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 25895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 25912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 25927de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 25955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 25965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 25985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 25995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 26005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 26015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 26025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 26035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 26050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 26065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 26085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2609a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2610a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 26115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 26130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 26170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 26192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 26202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 26212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 26225412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 26232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 26245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 26262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 26290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 26305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 26320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 26332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 26340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 26352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 26360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 26407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 26417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 26437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 26447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 26450654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 26460654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 26477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 26497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 26507ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 26517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 26527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2653f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 26547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 26557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 26560654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 26577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 26587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 26597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2660d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 26617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 26637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 26647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 26657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 26668e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 26678e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 2668d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 26697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 26707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2671f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2672bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2673bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2674bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 26757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 26760654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 26770654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 26780654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 26797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 26807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 26817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 26820951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 26833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 26847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 26857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2686a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2687e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_; 2688a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2689a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2690f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2691fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 2692a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2693a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2694a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2695a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2696a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2697a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2698a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2699a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2700a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2701a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2702a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2703e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_; 2704a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2705a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2706f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2707fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 2708fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 2709fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 2710fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 27110654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2712a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2713a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2714a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2715a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2716a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2717a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2719a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2720a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2721a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 27222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2723fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 2724fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 2725fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 2726fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 27270654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2728a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 27290654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2730a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2731a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27321590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 27331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27343c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 27353c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 2736fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", &endpoint, nullptr); 27371590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 27384943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 27390654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 27410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2742687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 27431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 27441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 27451590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 27461590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27473c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 2748fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 27493c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 2750fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path1(MakeNewEndpointAndService( 27510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 27523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 27531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2754c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2755c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2756c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2757c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 27583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 27593c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 27603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2761bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2762a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 27630654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 27643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2765687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 27660951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 27670951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 27681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 27691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2770e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2771e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 27720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 27730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 27740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 27753c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 2776fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 27773c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 2778fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path = 27793c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 27803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 27813c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2782687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 27830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2784687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2785687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2788687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2789687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2790687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2791687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2792687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 27930951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2794687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 27954eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 27964eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 27971caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonUpdated) { 27981caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ScopedMockLog log; 27991caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason = 4; 28001caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason_second = 0; 28011caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)) 28021caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein .Times(AnyNumber()); 28031caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), WiFi::kDefaultDisconnectReason); 28041caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(log, 28051caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein Log(logging::LOG_INFO, _, EndsWith(" DisconnectReason to 4"))); 28061caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason); 28071caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason); 28081caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_CALL(log, 28091caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein Log(logging::LOG_INFO, _, EndsWith("Reason to 0 (was 4)"))); 28101caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason_second); 28111caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason_second); 28121caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein} 28131caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein 28141caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonCleared) { 28151caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein int test_reason = 4; 28161caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // Clearing the value for supplicant_disconnect_reason_ is done prior to any 28171caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // early exits in the WiFi::StateChanged method. This allows the value to be 28181caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein // checked without a mock pending or current service. 28191caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportDisconnectReasonChanged(test_reason); 28201caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, test_reason); 28211caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 28221caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 28231caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, 28241caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein WiFi::kDefaultDisconnectReason); 28251caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein} 28261caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein 28278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 28288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28293c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 2830fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 28313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 28328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 28333c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 2834fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 28353c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 28360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 28378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28388a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 283949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 284049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 2841fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 284249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 284349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 2844fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, &bss_path)); 284549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 2846fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 284749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 284849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 284949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 285049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 285149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 285249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 285349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 285449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 285549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 28560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 28570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 285849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 285949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 286049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 28618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 28628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 28643c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2865fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 28668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 28678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 28694a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 2870fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu return arg.ContainsUint(WPASupplicant::kNetworkPropertyScanSSID) && 2871fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu arg.ContainsUint(WPASupplicant::kNetworkPropertyDisableVHT) && 2872fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu arg.ContainsString(WPASupplicant::kNetworkPropertyBgscan) == bgscan; 28734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 28744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 28754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 28764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 28773c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 28780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2879a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 2880fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 2881fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu AddNetwork(WiFiAddedArgs(true), _)); 28820654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 28834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 28844d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 28854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 28864a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 28874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 28883c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 28890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2890a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 2891fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 2892fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu AddNetwork(WiFiAddedArgs(false), _)); 28934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 28944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 28954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 28964a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 28974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2898f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 28994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 2901fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 29030951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29040951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2905fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 29064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 2909fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 29110951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29120951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 2914fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 2915fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu config_string = params.GetString(WPASupplicant::kNetworkPropertyBgscan); 29164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 29204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 29214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 29250654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 2926fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2930fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 2931fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string config_string = 2932fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu params.GetString(WPASupplicant::kNetworkPropertyBgscan); 29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 29374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29395c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 29405c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 29410654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 2942fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore params; 29433c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29445c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 29450951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29465c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 2947fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan)); 29485c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 29494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2951c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2952c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 29533c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2954fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 2955c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2956c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2957c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2958c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2959c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2960c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 29610951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2962c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2963c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2964c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2965c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 29663c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 2967fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr)); 29688f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 2969c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 29708f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 29718f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 29720654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 29735519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 29743c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 29753c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 29763c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 29778f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 29788f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 29795519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 29805519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 29813c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 29823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 29833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 29840654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 2985c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2986c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2987b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 2988b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 2989b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 2990b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 2991b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 2992e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu EXPECT_CALL(*control_interface(), CreateSupplicantBSSProxy(_, _)); 2993b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 2994b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 2995b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 2996b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 2997b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 2998b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 2999b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 3000b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 30012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockSupplicantBSSProxy* proxy = supplicant_bss_proxy_.get(); 3002b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 3003b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 3004fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path( 30050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 30060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 30073c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 3008b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 3009b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 3010b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 3011b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3012b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 30135c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 30145c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 30155c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 30165c05b2920be742d518829972127172481722058dmukesh agrawal 30175c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 30185c05b2920be742d518829972127172481722058dmukesh agrawal 30195c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 30205c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 30215c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 30223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 30235c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 30242f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 30255c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 30265c05b2920be742d518829972127172481722058dmukesh agrawal} 30275c05b2920be742d518829972127172481722058dmukesh agrawal 3028402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 3029402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 3030402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30314b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto- 30324b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // connectable services. 3033402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3034402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 3035402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30364b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)); 3037402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3038402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3039402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 3040402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3041402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3042402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 3043402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30444b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3045402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3046402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3047402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3048402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 3049402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3050402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 3051402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 3052402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3053402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 30544b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3055402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3056402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3057402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 3058402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 30605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 3061b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3062b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3063b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3064b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3065b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3066b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 30677de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 30680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3069b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 3070b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3071b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3072b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3073b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3074b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 30755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 30765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 30775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 30785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 30795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 30805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 30810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3082df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 30835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 30845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 30855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 30865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 30875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 30885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3089b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 3090b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3091b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3092b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3093b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3094b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3095b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 3096b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 3097b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 30985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3099b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3100b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3102b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3103b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3104b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 3105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3106b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 31073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 3108fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr); 3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3114b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3115b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3116b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3117b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3118b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31192d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) { 31202d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EnableFullScan(); 31212d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartWiFi(); 31222d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31232d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ReportScanDone(); 31242d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan CancelScanTimer(); 31252d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 31262d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 31272d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31282d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true)); 31302d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31312d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan FireScanTimer(); 31322d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31332d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); // Do not re-arm. 31342d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 31352d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 3137b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3143b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3144b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3145b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 3146b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3147b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3148b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3149b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3150b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3151b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3152b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3153b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3154b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 3155b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 3159b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3160b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3161b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 31635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 31645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 31655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 3166fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 31675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 31685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 31695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 3170a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 31715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 31725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 31735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 31745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 31755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 31765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 31785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3179b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 3180b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 31825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 3183fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 3184df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 31853c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 31863c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 31873c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 3188a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 31893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 31903c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 31915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 31920654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3193b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 3197b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3199fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 3201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 32023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32033c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 32040654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3205b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3206b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3207b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32083c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 32093c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 32102ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 32112ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 32123c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 32132ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 32143c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 32153c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 32163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 32172ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32182ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 32192ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 32203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 32213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 3222daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32242ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32252ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32262ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 32272ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 32282ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 32292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 32302ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32312ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 32322ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32332ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32342ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 3235a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3236a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu SetCurrentService(service); 32372ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 32383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3239daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 3240fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()) 3241fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce(Return(true)); 32423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32433c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3244a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu 3245a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu // Service is unreliable, skip reassociate attempt. 3246a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu service->set_unreliable(true); 3247a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3248a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EndsWith("skipping reassociate attempt."))).Times(1); 3249a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 3250a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu OnLinkMonitorFailure(); 3251a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 32533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 32548e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 32558e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 3256fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 32578e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 32588e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 32598e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 32608e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32618e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 32628e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 3263cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 3264f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3265bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 32660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 3267cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3268cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3269bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 3270f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 32710654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3272bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3273bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 3274bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 32750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 32761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3277bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 32781369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 3279cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3280cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3281f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 3282f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 3283f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 3284f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 3285a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3286f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 3287f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 3288f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3289f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 3290f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 3291f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 3292f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 3293f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 32948e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _)) 32958e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu .Times(AnyNumber()); 3296f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 3297f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3298f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3299f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3300f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3301f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3302f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 33030951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3304f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3305f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 3306f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 3307f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 3308f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 3309f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3310f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3311f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 3312f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 3313f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3314f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3315f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 3316f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 3317f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 33180d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33190d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33200d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3321f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33220951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3323f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3324f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 3325f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 3326f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 33280d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33290d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33300d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3331f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33320951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 3338f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 33390d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 33400d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33410d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3342f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 33451369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 3346f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3347735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3348735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3349735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 3350735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3351735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3352bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33540951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3355bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3356bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 33571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3358bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 33591369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 33600951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3361bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3362bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33640951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3365bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3366bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3367bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 33680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33691369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 33701369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 33711369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 3372f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 3373cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 33740654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3375cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3376a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3377bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3378f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 33794943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3380735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3381cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3382f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 33830654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 33841369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 33851369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 33861369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 3387f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 33881369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 33891369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 3390735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3391735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 33924943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3393735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 3394735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 3395735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 3396735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3397735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3398bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3399735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 34001369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 340139a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 3402735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 34030654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3404cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3405cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 34061964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 34071964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 34081964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 34091964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 34101964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 34111964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3412e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3413e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 34141aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3415e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 34161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3417e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3418e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3419e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3420e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3421e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3422e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3423e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34241aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3425e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3426e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3427e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3428e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3429e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3430e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3431e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3432e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3433e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3434e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3435e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3436e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3437e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3438e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3439e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3440e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3441e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3442e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3443e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3444e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3445e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3446e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3447e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3448e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3449e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3451e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3453e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34561aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 345766bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 345866bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 34590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3461e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3475e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34781aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 34791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 34801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 34813c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 3482fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 34831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 34841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 34851aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 34861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 34871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 34881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 34891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 34901aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 34911aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 34921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 34931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 34941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 34951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 34961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 34971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 34981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 34991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 35041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 35061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35077cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 35087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 35127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 35137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 3514fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 35157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 35167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35185412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 35197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 35207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 35217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 35237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 35257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 35287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 35297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 35307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 35347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 35357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 35367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 35377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 35387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 35407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 35437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 35447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 35455412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 35467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 35487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 35497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 35527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 35537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3555baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3556baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3557baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3558baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 35617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 35647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3570baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 35717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3572baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3573baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3574baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3575baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3576baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3577baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3578baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3579baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3580baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3581baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3582baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3583baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3584baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3585baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3586baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3587baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3588baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3589baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3590baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3591baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3592baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3593baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3594baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3595baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3596baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3597baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3598baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3599baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3600baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3601baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3602baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3603baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3604baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3605baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3606baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3607baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3608baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3609baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3610baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3611baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3612baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3613baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3614baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3615baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 36207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 36217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 36227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 36237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 36248e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 36257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 36267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 36277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3639baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3640baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3641baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3642baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3643baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3655e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3656e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3657e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3658e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3659e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3660e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3661e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3662e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3663e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3664e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3665e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3666e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3667e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3668e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3669e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3670e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3671e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3672e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3673e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3674e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3675e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3676e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3677e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3678e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3679e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3680e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3681e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3682e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3683e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3684e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3685e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3686e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3687e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3688e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3689e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3690e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3691e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 36928e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 36938e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3694e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3695e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3696e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3697e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3698e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3699e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 37007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 37017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 37021964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 37031964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 37041964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 37051964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 3706fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 37071964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 37081964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 37091964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 37101964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 37111964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 37121964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 37132d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) { 37142d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37152d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan // Return immediately if scan interval is 0. 37162d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(0, &e); 37172d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 37182d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37192d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37202d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37212d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) { 37222d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37232d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37242d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37252d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(1); 37262d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, 37272d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000)); 37282d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37302d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37312d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) { 37322d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37332d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37342d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37352d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(0); 37362d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000)); 37372d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37382d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3740bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3741f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3742bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3743bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3744bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3745bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3746fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu KeyValueStore args; 3747bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3748bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3749bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3750bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3751bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3752bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3753bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3754bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 37557fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 3756fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu args.SetUint(WPASupplicant::kInterfacePropertyDepth, kDepth); 3757bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3758bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3759bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3760bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3761bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3762bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3763bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 3764fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu args.SetString(WPASupplicant::kInterfacePropertySubject, kSubject); 3765bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3766bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3767db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3768db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 37693cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) { 37703cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanFailedTask if scan failed. 37713cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 37723cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, 37733cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds)); 37743cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(false); 37753cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_FALSE(ScanFailedCallbackIsCancelled()); 37763cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 37773cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed 37783cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // callback if has been dispatched. 37793cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)); 37803cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(true); 37813cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 37823cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 37833cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 3784db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 378511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3786db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3787db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3788735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3789735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3790735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3791735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3792db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3793db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3794db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3795f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3796db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3797735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3798db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3799735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 38000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3801735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3802db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3803735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3804735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3805735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 38060d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 38070d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38080d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3809735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 381011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 38112b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockEapCredentials* eap = new MockEapCredentials(); 381211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 381311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 381411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 381511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 381611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 381711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 381811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 381911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 382011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 38210d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 38220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 382411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 382511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 382611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 382711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 382811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 382911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 383011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 383111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 38320d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 383311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 383411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 383511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 383611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 383711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3838bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3839bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3840c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3841c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3842c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3843c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3844c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3845c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3846c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3847c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3848c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3849c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3850c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3851c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 38526d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 38536d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 38546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 38556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 38566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 38577fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 38586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 38596d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 38606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 38626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 38636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 38646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 38656d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 38666d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 38676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 38686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 38696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 38706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 38716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 38726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 38736d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 38746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 38766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 38776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 38786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 38796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 38806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 38826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 38836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 38846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 38856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 38866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 38876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 38887347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 38897347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 38906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38915581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 3892e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_; 38935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 38945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 38955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 3896fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 38975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 38985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 38995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 39015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 3902fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3903fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3904fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 3905fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 39085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 39115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 3912fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3913fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3914fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)), 3915fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3916fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3917fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)), 3918fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3919fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3920fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3921fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelExcessive)), 3922fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3923fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3924fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3925fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelExcessive)), 3926fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3927fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3928fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3929fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelMsgDump)), 3930fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3931fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3932fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3933fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelMsgDump)), 3934fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3935fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3936fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3937fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelWarning)), 3938fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3939fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3940fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>( 3941fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string(WPASupplicant::kDebugLevelWarning)), 3942fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 39555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 3956fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3957fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3958fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 3959fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39600654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 39615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 39665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 3967fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3968fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3969fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 3970fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39710654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 39725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 39775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 3978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)) 3979fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3980fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)), 3981fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))) 3982fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu .WillOnce( 3983fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)), 3984fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu Return(true))); 39855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 3990fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0); 39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 39965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 399750cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 399850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 399950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 400050cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 400150cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 4002bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 4003bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 4004bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 4005bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 4006bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4007bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40087fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 4009bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4010bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4011bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4012bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4013bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4014bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4015bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4016bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4017bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 4018bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4019bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40207fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 4021bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4022bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4023bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4024bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4025bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4026bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4027bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4028bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4029bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 4030bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4031bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 4032bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 4033bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4034bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4035bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 4036bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 40370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 40380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40390cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 40409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 4042a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4043a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4044a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4045a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4046a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 40497de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 40500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 40510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40570cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 40589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 4060fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 40619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 40629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 40639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 40640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4066a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4068a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4069a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4070a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 40730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 40740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40800cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 40819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 40820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 4083fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 40849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 40859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 40860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4088a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4090a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4091a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4092a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 40950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 40960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 41010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4102df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 41039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4104df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 41059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 41069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 4107df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4108df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 4109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 4111a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 41129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4113df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4114df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4115df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4116df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 4117df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 4118df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 4119df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 4120df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4122df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4123df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4125b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 4126b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4127b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 4128df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 4129b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 4130b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4131df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 4132df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4133df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 4134df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4136df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4137b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 4138b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 4139b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 4140b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4141df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 4142df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4143df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4144df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 4145df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4147df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4148df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4150df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 4151df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4152df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4153df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 41540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 4155df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 41569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4157df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4158df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 4159a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4160a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 4162fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4165df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 4166a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4167a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 41689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4170df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4172df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 4173df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 4174df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 4175fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", nullptr, nullptr)); 4176df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 41790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4181a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4182a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 4183df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4184df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4185df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 41869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4187df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4188a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4189fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)). 4190fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu WillOnce(Return(false)); 4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4192df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4194f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 4195f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4196a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 4198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4202df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 42030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 42040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 42050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 4206df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 42079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 4211a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4212a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4213f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 4218a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4219df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4220df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4221df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4222df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 4227df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 4228f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 4229a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 4230a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 42312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 4233a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 4234a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4235a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4236a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4237df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 4238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 4239a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 4242a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4243df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4244df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 4245fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string bss_path; 4246a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4249df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4250df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 4251df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 4254fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectingService("", &endpoint, &bss_path); 4255df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 4257a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 4258df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 4259df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 4260df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 42653bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 42663bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 4267fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu SetupConnectedService("", nullptr, nullptr); 42683bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42693bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42703bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 42712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 42723bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 42733bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 42743bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42753bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 42767de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 42773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 42783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 42803bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 42822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 42832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 42852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 42862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 42872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 42882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 42892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 42902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 42922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 42932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 42942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 42952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 42972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 42982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 43002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 43012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 43022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 43032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 43042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 43052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 43072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 43082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 4311618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, TDLSDiscoverResponse) { 4312618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu const char kPeer[] = "peer"; 43132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>(); 4314618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu SetTDLSManager(tdls_manager); 43153c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 4316618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_CALL(*tdls_manager, OnDiscoverResponseReceived(kPeer)); 4317618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu TDLSDiscoverResponse(kPeer); 4318618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu Mock::VerifyAndClearExpectations(tdls_manager); 4319618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu} 4320c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4321618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, PerformTDLSOperation) { 4322618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu const char kPeerMac[] = "00:11:22:33:44:55"; 43232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>(); 4324618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu SetTDLSManager(tdls_manager); 4325618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu 4326618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu Error error; 432762abf31989c52dc1e4ee5aae71664ba81d6fe2dbPeter Qiu // No address resolution is performed since MAC address is provided. 4328618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_CALL(*tdls_manager, 4329618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu PerformOperation(kPeerMac, kTDLSStatusOperation, &error)) 4330618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu .WillOnce(Return(kTDLSConnectedState)); 4331618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_EQ(kTDLSConnectedState, 4332618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu PerformTDLSOperation(kTDLSStatusOperation, kPeerMac, &error)); 4333618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu EXPECT_TRUE(error.IsSuccess()); 4334c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4335c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 43363946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 4337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage new_wiphy_message; 4338b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4339b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart new_wiphy_message.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 43403946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 4341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_)); 4342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex)); 4343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->clear(); 43443946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 4345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies), 4346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->size()); 4347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) { 4348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(GetAllScanFrequencies()->find(freq) != 4349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->end()); 4350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 43513946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 43523946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 43533946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 43543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 43553946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 43563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 43573946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 43583946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 43593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 43603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 43613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 43623c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4363787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4364787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4365787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 43664bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 4367787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4368787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4369787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4370787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4371787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4372787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4373787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4374787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4375787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 43763c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 43773c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 43783c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 43793c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 43803c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 43813c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4382787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4383787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4384787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4385787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4386787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 438714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(true); 4388c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4389c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4390d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 43914c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4392787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 439314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 439414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(false); 439514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan EXPECT_CALL(*wake_on_wifi_, 439614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)) 439714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan .Times(0); 43984c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess))); 439914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnBeforeSuspend(); 4400787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4401787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4402787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 440314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(true); 4404787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4405d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 44064c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(_)).Times(0); 4407787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 440814ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan 440914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan SetWiFiEnabled(false); 441014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan EXPECT_CALL(*wake_on_wifi_, 441114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)) 441214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan .Times(0); 44134c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess))); 441414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan OnDarkResume(); 44153fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44173fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 44183fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 44193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 44203fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 44213fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 44223fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 4423fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path1(kNetworkRpcId1); 4424fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu string path2(kNetworkRpcId2); 44253fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 44263fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 44273fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 44283fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 44293fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 44303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 44313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 44323fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44333fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) { 44355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 44365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Device::ScanType scan_type = Device::kFullScan; 44375d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 44385d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 44395d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 44405d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 44415d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 44425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan scan_type = Device::kProgressiveScan; 44435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 44445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 44455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 44465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan} 44475d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 44483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 44493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 44503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 44513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 44523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 44533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 44543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 44553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 44563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 44573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 44583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 44593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 44605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 44613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 44623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 44633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44655d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) { 44665d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 44674b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan StartWiFi(); 44685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 44693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 44705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 44715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 44725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 44735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)); 44745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 44755d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 44765d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_TRUE(manager()->suppress_autoconnect()); 44773fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44783fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44795d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) { 44805d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 44813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 44825d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 44835d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SetPendingService(service); 44845d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 44855d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 44863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 44875d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL( 44885d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan log, 44895d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 44905d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 44915d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 44925d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 44935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)).Times(0); 44945d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0); 44955d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 44965d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 44973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 44983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 44995d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) { 4500381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan ScopedMockLog log; 45015d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45025d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 45035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 4504381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_CALL(netlink_manager_, 4505381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4506381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan TriggerScanMessage::kCommand), 4507381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan _, _, _)); 45085d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 45105d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(0); 45115d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 45125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4514381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan} 4515381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan 45165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) { 45175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 45185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45195d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 45205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs = {1}; 45213fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 45223fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 45233fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 45243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 45255d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 45275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(1); 45285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 45295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45305d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4531787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4532787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4533050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) { 4534050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // This test essentially performs ReportBSS(), but ensures that the 4535050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // WiFi object successfully dispatches events in order. 4536050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart StartWiFi(); 4537050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4538050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss0", 4539050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0, 4540050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4541050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4542050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss1", 4543050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0, 4544050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4545050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSRemoved("bss0"); 4546050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4547050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss2", 4548050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0, 4549050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4550050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4551050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00"); 4552050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 4553050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 4554050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4555050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart InSequence seq; 4556050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))); 4557050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))); 4558050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiServiceRefPtr null_service; 4559050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0))) 4560050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart .WillOnce(Return(null_service)); 4561050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))); 4562050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart dispatcher_.DispatchPendingEvents(); 4563050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 4564050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 45652b363903f38a515001c5edc7202403fcddb15a01Paul Stewart const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap(); 4566050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_EQ(2, endpoints_by_rpcid.size()); 4567050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 4568050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4569235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) { 4570235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag 4571235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // for having the wiphy index is set by ParseWiphyIndex. 4572235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex); 4573235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4574b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4575b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4576235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(ParseWiphyIndex(msg)); 4577235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex); 4578235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4579235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4580235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) { 4581235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan ScopedMockLog log; 4582235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ 4583235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // U32 attribute, so that this message no longer contains a wiphy_index to be 4584235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // parsed. 4585235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4586b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 45872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart struct nlattr* nl80211_attr_wiphy = reinterpret_cast<struct nlattr*>( 4588b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart &packet.GetMutablePayload()->GetData()[ 4589b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kNewWiphyNlMsg_Nl80211AttrWiphyOffset]); 4590235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ; 4591b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4592235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4593235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 4594235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY")); 4595235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_FALSE(ParseWiphyIndex(msg)); 4596235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0); 4597235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4598235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4599d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) { 4600d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4601d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4602b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet( 4603b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kActiveScanTriggerNlMsg, sizeof(kActiveScanTriggerNlMsg)); 4604b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4605d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true)); 4606d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4607d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4608d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4609d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) { 4610d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4611d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4612b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart NetlinkPacket packet( 4613b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart kPassiveScanTriggerNlMsg, sizeof(kPassiveScanTriggerNlMsg)); 4614b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart msg.InitFromPacket(&packet, NetlinkMessage::MessageContext()); 4615d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false)); 4616d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4617d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4618d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4619853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4620