wifi_unittest.cc revision 3c898323878e95b40abcfc6c7a993555d4675323
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be 3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file. 4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi.h" 6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h> 85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h> // Needs typedefs from sys/socket.h. 95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h> 10ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include <netlink/attr.h> 115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h> 12f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map> 14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string> 15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector> 16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h> 187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h> 19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h> 20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h> 22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h> 23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h> 241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h> 25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h" 27125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h" 2826b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h" 296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h" 30397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h" 317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h" 32b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 33853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h" 340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h" 35084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h" 36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h" 37c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h" 38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h" 39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h" 4011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h" 41e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h" 42687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h" 433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h" 44cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h" 452ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h" 463426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 4710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h" 48af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h" 49a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h" 5002e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h" 518d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h" 5202e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h" 538d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h" 548d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h" 5502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h" 5602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h" 5702e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h" 58dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h" 59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h" 60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h" 61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h" 62da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h" 63da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h" 64da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h" 65da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h" 6685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h" 67af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h" 68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h" 69d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h" 70d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h" 71d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h" 72d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h" 73d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h" 74d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h" 75d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h" 76d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h" 77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 780e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 79a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf; 80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map; 815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set; 82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string; 83ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr; 84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector; 85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_; 863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber; 873c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast; 883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue; 89a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll; 90cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith; 910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr; 923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence; 93b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke; 94549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs; 955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher; 965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher; 975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface; 985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener; 997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock; 100dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock; 101d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull; 10211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref; 103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return; 104af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew; 105ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef; 106ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg; 107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee; 108a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq; 109a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock; 110853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test; 1113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw; 1128ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values; 113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill { 115853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace { 1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13; 1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600; 1205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560; 1215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422; 122c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234; 123125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999"; 124235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 125235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi 126235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// capabilities of a NIC with wiphy index |kNewWiphyNlMsg_WiphyIndex| which 127235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// supports operating bands with the frequencies specified in 128235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// |kNewWiphyNlMsg_UniqueFrequencies|. 129235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint8_t kNewWiphyNlMsg[] = { 130235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x68, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 131235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xf6, 0x31, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 132235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30, 133235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 134235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00, 135235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff, 136235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00, 137235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x00, 0x00, 138235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00, 139235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd1, 0x08, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 140235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00, 141235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x8b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x18, 0x00, 0x39, 0x00, 142235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 0x02, 0xac, 0x0f, 0x00, 143235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0xac, 0x0f, 0x00, 0x06, 0xac, 0x0f, 0x00, 0x05, 0x00, 0x56, 0x00, 144235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00, 145235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x03, 0x00, 0x00, 0x00, 146235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x69, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6a, 0x00, 147235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00, 148235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 149235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 150235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x09, 0x00, 0x50, 0x05, 0x16, 0x00, 0xf8, 0x01, 0x00, 0x00, 151235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 153235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 154235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00, 155235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00, 156235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 157235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 158235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 159235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 160235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00, 161235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 162235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 163235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 164235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 165235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00, 166235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00, 167235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 168235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 169235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 170235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00, 171235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00, 172235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 173235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 174235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa3, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 175235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00, 176235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 177235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 178235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb4, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 179235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 180235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 181235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 182235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x00, 183235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 184235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00, 185235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 186235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 187235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 188235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 189235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00, 190235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00, 191235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0b, 0x00, 192235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x54, 0x03, 0x01, 0x00, 193235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 194235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 195235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00, 196235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0x00, 197235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00, 198235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 199235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 200235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 201235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00, 202235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 203235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 204235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 205235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x8c, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 206235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 207235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 0x00, 0x00, 208235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 209235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 210235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 211235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 212235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00, 213235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc8, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 214235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 215235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 0x15, 0x00, 0x00, 216235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 217235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x09, 0x00, 218235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 219235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 220235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00, 221235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa4, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 222235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 223235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 0x00, 0x00, 224235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 225235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0c, 0x00, 226235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 227235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 228235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00, 229235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 230235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 231235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00, 232235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 233235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 234235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 235235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 236235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 237235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 238235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 239235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00, 240235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 241235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00, 242235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 243235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 244235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00, 245235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 246235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x16, 0x00, 0x00, 247235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 248235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00, 249235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 250235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00, 251235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 252235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 253235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc1, 0x16, 0x00, 0x00, 254235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 255235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x07, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00, 256235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 257235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00, 258235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 259235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00, 260235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00, 261235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 262235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 263235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xd4, 0x00, 0x32, 0x00, 264235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 265235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 266235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 267235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x19, 0x00, 0x00, 0x00, 268235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 269235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x00, 270235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 271235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x00, 0x00, 272235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 273235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x43, 0x00, 0x00, 0x00, 274235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 275235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x42, 0x00, 0x00, 0x00, 276235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x13, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 277235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x00, 278235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x16, 0x00, 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 279235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00, 280235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x19, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 281235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x88, 0x13, 0x00, 0x00, 282235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x6c, 0x00, 0xac, 0x03, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00, 283235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 284235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 285235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 286235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 287235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 288235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 289235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 290235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 291235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 292235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 293235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 294235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 295235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 296235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 297235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 298235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 299235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 300235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 301235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 302235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 303235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 309235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 310235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 311235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 315235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 316235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 317235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 318235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 319235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00, 328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00, 339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 344235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00, 350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 351235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 352235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00, 354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00, 356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00, 360235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x14, 0x01, 0x64, 0x00, 361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 367235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 368235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 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 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00, 375235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 376235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 377235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 378235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00, 379235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 380235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 381235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 382235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00, 384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x50, 0x00, 0x78, 0x00, 385235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x4c, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00, 386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 387235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00, 388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x18, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x0c, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x09, 0x00, 390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 391235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00, 392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x1e, 0x00, 0x94, 0x00, 0x42, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint32_t kNewWiphyNlMsg_WiphyIndex = 2; 396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst int kNewWiphyNlMsg_Nl80211AttrWiphyOffset = 20; 397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint16_t kNewWiphyNlMsg_UniqueFrequencies[] = { 398235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 399235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 2462, 2467, 2472, 2484, 5180, 5200, 5220, 5240, 5260, 5280, 400235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 401235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825}; 4025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 403d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint32_t kScanTriggerMsgWiphyIndex = 0; 404d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kActiveScanTriggerNlMsg[] = { 405d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x44, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 407d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 408d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x2c, 0x00, 410d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 411d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 412d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 413d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 414d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 415d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 416d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 417d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 418d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 419d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 420d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 421d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 422d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 423d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 424d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 425d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 426d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 427d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 428d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 429d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 430d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 431d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 432d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 433d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kPassiveScanTriggerNlMsg[] = { 434d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x40, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 435d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 436d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 437d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 438d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x04, 0x00, 0x2d, 0x00, 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00, 439d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 440d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 441d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00, 442d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 443d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00, 444d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 445d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00, 446d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 447d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00, 448d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 449d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00, 450d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 451d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00, 452d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 453d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00, 454d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 455d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00, 456d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00, 457d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00, 458d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00, 459d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00, 460d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00}; 461d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} // namespace 4635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 4643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest { 465853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public: 4663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiPropertyTest() 4670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan : metrics_(nullptr), 4683946da840142cd386d628c0e879459f8976bd86dmukesh agrawal device_( 4693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal new WiFi(control_interface(), dispatcher(), &metrics_, 4703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal manager(), "wifi", "", kInterfaceIndex)) { 471853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone } 4723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal virtual ~WiFiPropertyTest() {} 473853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 474853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected: 4753946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMetrics metrics_; 4768abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFiRefPtr device_; 477853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}; 478853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 4793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) { 480f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_TRUE(device_->store().Contains(kNameProperty)); 481de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal EXPECT_FALSE(device_->store().Contains("")); 482853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} 483853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 4846bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) { 485a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 486a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 4876bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 488de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal device_->mutable_store(), 489f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanSignalThresholdProperty, 490a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone PropertyStoreTest::kInt32V, 491a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone &error)); 492a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 493a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 494a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 4956bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(), 496f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanIntervalProperty, 4976bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kUint16V, 4986bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 499a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 500853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone // Ensure that an attempt to write a R/O property returns InvalidArgs error. 501a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone { 502a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone ::DBus::Error error; 5036bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(), 504f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kScanningProperty, 5056bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal PropertyStoreTest::kBoolV, 5066bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal &error)); 507bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise 5089d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone EXPECT_EQ(invalid_args(), error.name()); 509a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone } 510853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone 5114d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 5124d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 5136bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 5144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 515f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 5164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant( 5170654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkBgscanMethodSimple), 5184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5194d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5204d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 5214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal { 5224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal ::DBus::Error error; 5236bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_FALSE(DBusAdaptor::SetProperty( 5244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal device_->mutable_store(), 525f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 5264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal DBusAdaptor::StringToVariant("not a real scan method"), 5274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal &error)); 5284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal } 5294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 5304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 5314a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) { 5320654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn, 5338abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal WiFi::kDefaultBgscanMethod); 5344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 5364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string method; 537e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart Error unused_error; 538e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 539f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5410654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method); 5428abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5438abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal ::DBus::Error error; 5446bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal EXPECT_TRUE(DBusAdaptor::SetProperty( 5458abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal device_->mutable_store(), 546f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 547f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn), 5488abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal &error)); 5490654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_); 550e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 551f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5520654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method); 5538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal EXPECT_TRUE(DBusAdaptor::ClearProperty( 555f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan device_->mutable_store(), kBgscanMethodProperty, &error)); 556e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart EXPECT_TRUE(device_->store().GetStringProperty( 557f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, &method, &unused_error)); 5584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, method); 5594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE(device_->bgscan_method_.empty()); 5608abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal} 5618abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal 5623c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") { 5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart return 5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->ssid() == endpoint->ssid() && 5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->network_mode() == endpoint->network_mode() && 5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart arg->security_mode() == endpoint->security_mode(); 5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart 5695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 570e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> { 5713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public: 572bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie explicit WiFiObjectTest(EventDispatcher *dispatcher) 573e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart : event_dispatcher_(dispatcher), 5740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan metrics_(nullptr), 5750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan manager_(&control_interface_, nullptr, &metrics_, &glib_), 576e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart device_info_(&control_interface_, dispatcher, &metrics_, &manager_), 577fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_, 578fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan kDeviceName, kDeviceAddress, kInterfaceIndex)), 5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_(0), 580fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan mac80211_monitor_(new StrictMock<MockMac80211Monitor>( 581fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold, 582fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan base::Closure(), &metrics_)), 583084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_service_proxy_(new MockDBusServiceProxy()), 584dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()), 585af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()), 586af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)), 587084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_(new DBusManager()), 5880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie adaptor_(new DeviceMockAdaptor()), 589735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()), 5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart supplicant_interface_proxy_( 591af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new NiceMock<MockSupplicantInterfaceProxy>()) { 5923946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->mac80211_monitor_.reset(mac80211_monitor_); 5935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 594fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan InstallMockWakeOnWiFi(); 595e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan ::testing::DefaultValue<::DBus::Path>::Set("/default/path"); 596c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 5973946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_)) 5983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal .Times(AnyNumber()); 5993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 600b108318d9554032feee1249d51c961e4f90f4561Paul Stewart ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)) 601af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(Return(dhcp_config_)); 602af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true)); 6032d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false)); 604af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan 605af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateDBusServiceProxy()) 606af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_)); 607af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _)) 608af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_)); 609af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _)) 610af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_)); 611af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _)) 612af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_)); 613af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)) 614af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>()); 615318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie Nl80211Message::SetMessageType(kNl80211FamilyId); 616ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 617735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Transfers ownership. 618735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart manager_.dbus_manager_.reset(dbus_manager_); 619735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart wifi_->eap_state_handler_.reset(eap_state_handler_); 6202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 6213c5040174273386868cc8dea8044d22c465885d8Paul Stewart wifi_->provider_ = &wifi_provider_; 6225c05b2920be742d518829972127172481722058dmukesh agrawal wifi_->time_ = &time_; 623bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->netlink_manager_ = &netlink_manager_; 6245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = true; 6250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie wifi_->adaptor_.reset(adaptor_); // Transfers ownership. 6265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // The following is only useful when a real |ScanSession| is used; it is 6285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // ignored by |MockScanSession|. 6295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1); 6305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2); 6315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3); 6323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 6335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6345c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void SetUp() { 6353ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // EnableScopes... so that we can EXPECT_CALL for scoped log messages. 6363ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 637d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(3); 638084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->proxy_factory_ = &proxy_factory_; 639ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov wifi_->proxy_factory_ = &proxy_factory_; 6400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko 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()); 6455c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal } 6465c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 6475c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal virtual void TearDown() { 6483c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)) 6490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillRepeatedly(Return(nullptr)); 6500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SelectService(nullptr); 651b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal if (supplicant_bss_proxy_.get()) { 652b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()); 653b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 6543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 6550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->proxy_factory_ = nullptr; 6563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // must Stop WiFi instance, to clear its list of services. 6573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // otherwise, the WiFi instance will not be deleted. (because 6583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // services reference a WiFi instance, creating a cycle.) 6590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Stop(nullptr, ResultCallback()); 6600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->set_dhcp_provider(nullptr); 661084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Stop(); 6620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan dbus_manager_->proxy_factory_ = nullptr; 6633ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal // Reset scope logging, to avoid interfering with other tests. 6643ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 665d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley ScopeLogger::GetInstance()->set_verbose_level(0); 666f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 667f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal 668549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart // Needs to be public since it is called via Invoke(). 669549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart void StopWiFi() { 6703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor_, Stop()); 6710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(false); // Stop(nullptr, ResultCallback()); 672549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart } 673549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 674c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // Needs to be public since it is called via Invoke(). 675c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley void ThrowDBusError() { 676c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley throw DBus::Error("SomeDBusType", "A handy message"); 677c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley } 67817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart void ResetPendingService() { 6790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 68017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart } 681c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 6825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie size_t GetScanFrequencyCount() const { 6835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return wifi_->all_scan_frequencies_.size(); 6845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void SetScanSize(int min, int max) { 6875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->min_frequencies_to_scan_ = min; 6885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->max_frequencies_to_scan_ = max; 6895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a 6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // real scan session. 6935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ClearScanSession() { 6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie bool IsScanSessionNull() { 6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie return !wifi_->scan_session_; 6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void InstallMockScanSession() { 7025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie WiFiProvider::FrequencyCountList previous_frequencies; 7035f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan set<uint16_t> available_frequencies; 7045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::FractionList fractions; 7055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScanSession::OnScanFailed null_callback; 7065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie scan_session_ = new MockScanSession(&netlink_manager_, 7075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie event_dispatcher_, 7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie previous_frequencies, 7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie available_frequencies, 7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie fractions, 7125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 0, 714f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie null_callback, 7150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr); 7165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(scan_session_); 7175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 719fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan void InstallMockWakeOnWiFi() { 720fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_, 72166bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan &metrics_); 722fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan wifi_->wake_on_wifi_.reset(wake_on_wifi_); 723fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan } 724fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan 7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Or DisableProgressiveScan()... 7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void EnableFullScan() { 7275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->progressive_scan_enabled_ = false; 7285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 7307347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie void OnTriggerScanResponse(const Nl80211Message &message) { 7315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_->OnTriggerScanResponse(message); 7325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 7335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 734b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie void SetScanState(WiFi::ScanState new_state, 735b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie WiFi::ScanMethod new_method, 736b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie const char *reason) { 737b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie wifi_->SetScanState(new_state, new_method, reason); 738b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie } 739b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 7409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const { 7410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(state, wifi_->scan_state_); 7420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_EQ(method, wifi_->scan_method_); 7430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie } 7440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 7457fab89734d88724a288e96a9996b15548c5294c7Ben Chan void SetRoamThresholdMember(uint16_t threshold) { 746227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie wifi_->roam_threshold_db_ = threshold; 747227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 748227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7497fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetRoamThreshold(uint16_t threshold) { 750227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->SetRoamThreshold(threshold, nullptr); 751227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 752227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7537fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t GetRoamThreshold() const { 754227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie return wifi_->GetRoamThreshold(nullptr); 755227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie } 756227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 7573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 7587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr; 7597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 7602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Simulate the course of events when the last endpoint of a service is 7613c5040174273386868cc8dea8044d22c465885d8Paul Stewart // removed. 7623c5040174273386868cc8dea8044d22c465885d8Paul Stewart class EndpointRemovalHandler { 763bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie public: 764bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service) 765bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie : wifi_(wifi), service_(service) {} 766bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie virtual ~EndpointRemovalHandler() {} 767bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie 768bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie WiFiServiceRefPtr OnEndpointRemoved( 769bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiEndpointConstRefPtr &endpoint) { 770bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie wifi_->DisassociateFromService(service_); 771bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie return service_; 772bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie } 7733c5040174273386868cc8dea8044d22c465885d8Paul Stewart 7743c5040174273386868cc8dea8044d22c465885d8Paul Stewart private: 7753c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiRefPtr wifi_; 7763c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service_; 7773c5040174273386868cc8dea8044d22c465885d8Paul Stewart }; 7783c5040174273386868cc8dea8044d22c465885d8Paul Stewart 7793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EndpointRemovalHandler *MakeEndpointRemovalHandler( 780bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie const WiFiServiceRefPtr &service) { 7813c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new EndpointRemovalHandler(wifi_, service); 7823c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void CancelScanTimer() { 784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->scan_timer_callback_.Cancel(); 785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 7863c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function creates a new endpoint with a mode set to |mode|. We 7873c5040174273386868cc8dea8044d22c465885d8Paul Stewart // synthesize new |path| and |bssid| values, since we don't really care 7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart // what they are for unit tests. If "use_ssid" is true, we used the 7893c5040174273386868cc8dea8044d22c465885d8Paul Stewart // passed-in ssid, otherwise we create a synthesized value for it as well. 7903c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeNewEndpoint(const char *mode, 7913c5040174273386868cc8dea8044d22c465885d8Paul Stewart bool use_ssid, 7923c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *ssid, 7933c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *path, 7943c5040174273386868cc8dea8044d22c465885d8Paul Stewart string *bssid) { 7953c5040174273386868cc8dea8044d22c465885d8Paul Stewart bss_counter_++; 7963c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (!use_ssid) { 797a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *ssid = StringPrintf("ssid%d", bss_counter_); 7983c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 799a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *path = StringPrintf("/interface/bss%d", bss_counter_); 800a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_); 8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode); 8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, 8033c5040174273386868cc8dea8044d22c465885d8Paul Stewart OnEndpointAdded(EndpointMatch(endpoint))).Times(1); 8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart return endpoint; 8053c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8063c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) { 8073c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure); 8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8093c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr MakeEndpointWithMode( 8103c5040174273386868cc8dea8044d22c465885d8Paul Stewart const string &ssid, const string &bssid, const string &mode) { 8113c5040174273386868cc8dea8044d22c465885d8Paul Stewart return WiFiEndpoint::MakeOpenEndpoint( 8120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0); 8133c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockServiceWithSSID( 8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t> ssid, const std::string &security) { 8163c5040174273386868cc8dea8044d22c465885d8Paul Stewart return new NiceMock<MockWiFiService>( 8173c5040174273386868cc8dea8044d22c465885d8Paul Stewart &control_interface_, 8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart event_dispatcher_, 8193c5040174273386868cc8dea8044d22c465885d8Paul Stewart &metrics_, 8203c5040174273386868cc8dea8044d22c465885d8Paul Stewart &manager_, 8213c5040174273386868cc8dea8044d22c465885d8Paul Stewart &wifi_provider_, 8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssid, 823f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kModeManaged, 8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart security, 8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart false); 8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8273c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr MakeMockService(const std::string &security) { 8283c5040174273386868cc8dea8044d22c465885d8Paul Stewart return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security); 8293c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8303c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength, 8317fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 8323c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 8333c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr *service_ptr) { 8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid; 8363c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, false, &ssid, &path, &bssid); 8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode()); 8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8433c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1)); 8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (service_ptr) { 8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart *service_ptr = service; 8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8493c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path AddEndpointToService( 8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service, 8563c5040174273386868cc8dea8044d22c465885d8Paul Stewart int16_t signal_strength, 8577fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 8583c5040174273386868cc8dea8044d22c465885d8Paul Stewart const char *mode, 8593c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr) { 8603c5040174273386868cc8dea8044d22c465885d8Paul Stewart string ssid(service->ssid().begin(), service->ssid().end()); 8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path path; 8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart string bssid; 8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint = 8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeNewEndpoint(mode, true, &ssid, &path, &bssid); 8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint))) 8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(service)); 8673c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS(path, ssid, bssid, signal_strength, frequency, mode); 8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8713c5040174273386868cc8dea8044d22c465885d8Paul Stewart return path; 8723c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateConnect(WiFiServiceRefPtr service) { 8740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->ConnectTo(service.get()); 8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart void InitiateDisconnect(WiFiServiceRefPtr service) { 8770951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFrom(service.get()); 8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 879d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein void InitiateDisconnectIfActive(WiFiServiceRefPtr service) { 8800951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko wifi_->DisconnectFromIfActive(service.get()); 881d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein } 8823c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectingService( 8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 8853c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 8873c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 8883c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path(MakeNewEndpointAndService( 8893c5040174273386868cc8dea8044d22c465885d8Paul Stewart 0, 0, kNetworkModeAdHoc, &endpoint, &service)); 890a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart if (!network_path.empty()) { 891a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 892a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)) 893a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart .WillOnce(Return(network_path)); 8948e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), 8958e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu SetHT40Enable(network_path, true)); 896a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path)); 897a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart } 8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart InitiateConnect(service); 9000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9053c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9063c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9073c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9103c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9113c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr SetupConnectedService( 9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart const DBus::Path &network_path, 9133c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr *endpoint_ptr, 9143c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path *bss_path_ptr) { 9153c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 9163c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path; 9173c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 9183c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectingService(network_path, &endpoint, &bss_path); 9193c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (endpoint_ptr) { 9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart *endpoint_ptr = endpoint; 9213c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9223c5040174273386868cc8dea8044d22c465885d8Paul Stewart if (bss_path_ptr) { 9233c5040174273386868cc8dea8044d22c465885d8Paul Stewart *bss_path_ptr = bss_path; 9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 9253c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 9263c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 9280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9293c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 931bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 932b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 934a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(wifi_provider_, IncrementConnectCount(_)); 9350654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 9360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart 9383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service, GetCurrentService()); 9393c5040174273386868cc8dea8044d22c465885d8Paul Stewart return service; 9401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 942b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal void FireScanTimer() { 943b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal wifi_->ScanTimerHandler(); 944b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 9452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void TriggerScan(WiFi::ScanMethod method) { 9462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (method == WiFi::kScanMethodFull) { 9470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kFullScan, nullptr, __func__); 9482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 9490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->Scan(Device::kProgressiveScan, nullptr, __func__); 9502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } 951c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley } 9521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetCurrentService() { 9531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->current_service_; 9541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 955bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void SetCurrentService(const WiFiServiceRefPtr &service) { 956bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->current_service_ = service; 957bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 9583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const WiFi::EndpointMap &GetEndpointMap() { 959165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal return wifi_->endpoint_by_rpcid_; 9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal const WiFiServiceRefPtr &GetPendingService() { 9621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal return wifi_->pending_service_; 9631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 9642b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &GetPendingTimeout() { 9652b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart return wifi_->pending_timeout_callback_; 9662b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart } 9671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart const base::CancelableClosure &GetReconnectTimeoutCallback() { 968446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart return wifi_->reconnect_timeout_callback_; 969446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart } 9702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal const ServiceRefPtr &GetSelectedService() { 9712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal return wifi_->selected_service(); 9722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal } 9737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart const string &GetSupplicantBSS() { 9747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart return wifi_->supplicant_bss_; 9757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 9767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void SetSupplicantBSS(const string &bss) { 9777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->supplicant_bss_ = bss; 9787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 9791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart int GetReconnectTimeoutSeconds() { 9801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart return WiFi::kReconnectTimeoutSeconds; 9811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 982b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal const base::CancelableClosure &GetScanTimer() { 983b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal return wifi_->scan_timer_callback_; 984b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 9853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // note: the tests need the proxies referenced by WiFi (not the 986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // proxies instantiated by WiFiObjectTest), to ensure that WiFi 9873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // sets up its proxies correctly. 9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal SupplicantProcessProxyInterface *GetSupplicantProcessProxy() { 9893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal return wifi_->supplicant_process_proxy_.get(); 9903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9913c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() { 9928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal return dynamic_cast<MockSupplicantInterfaceProxy *>( 9938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal wifi_->supplicant_interface_proxy_.get()); 9943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 9953c5040174273386868cc8dea8044d22c465885d8Paul Stewart // This function returns the supplicant interface proxy whether 9963c5040174273386868cc8dea8044d22c465885d8Paul Stewart // or not we have passed the instantiated object to the WiFi instance 9973c5040174273386868cc8dea8044d22c465885d8Paul Stewart // from WiFiObjectTest, so tests don't need to worry about when they 9983c5040174273386868cc8dea8044d22c465885d8Paul Stewart // set expectations relative to StartWiFi(). 9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() { 10003c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi(); 10013c5040174273386868cc8dea8044d22c465885d8Paul Stewart return proxy ? proxy : supplicant_interface_proxy_.get(); 10023c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 10037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal const string &GetSupplicantState() { 10047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal return wifi_->supplicant_state_; 10057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 1006835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart void ClearCachedCredentials(const WiFiService *service) { 1007835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart return wifi_->ClearCachedCredentials(service); 1008835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart } 10090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) { 10100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart wifi_->NotifyEndpointChanged(endpoint); 10110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart } 1012381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan bool RemoveNetwork(const ::DBus::Path &network) { 1013381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan return wifi_->RemoveNetwork(network); 1014381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan } 1015050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart map<string, ::DBus::Variant> CreateBSSProperties(const string &ssid, 1016050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1017050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1018050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1019050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode); 1020261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal void RemoveBSS(const ::DBus::Path &bss_path); 10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportBSS(const ::DBus::Path &bss_path, 10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &ssid, 10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const string &bssid, 10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal int16_t signal_strength, 10257fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency, 10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal const char *mode); 1027c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal void ReportIPConfigComplete() { 10283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, true); 10293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan } 10303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan void ReportIPConfigCompleteGatewayArpReceived() { 10313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan wifi_->OnIPConfigUpdated(dhcp_config_, false); 1032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal } 1033050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1034050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // Calls the delayed version of the BSS methods. 1035050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart void BSSAdded(const ::DBus::Path &bss_path, 1036050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const map<string, ::DBus::Variant> &properties) { 1037050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAdded(bss_path, properties); 1038050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1039050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart void BSSRemoved(const ::DBus::Path &bss_path) { 1040050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSRemoved(bss_path); 1041050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart } 1042050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1043787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void ReportIPv6ConfigComplete() { 1044787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnIPv6ConfigUpdated(); 1045787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1046f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportIPConfigFailure() { 1047f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnIPConfigFailure(); 1048f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1049f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart void ReportConnected() { 1050f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart wifi_->OnConnected(); 1051f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart } 1052f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal void ReportLinkUp() { 1053f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP); 1054f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal } 10553cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan void ScanDone(const bool &success) { 10563cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanDone(success); 10573cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10583cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan void ReportScanFailed() { 10593cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan wifi_->ScanFailedTask(); 10603cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 10613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal void ReportScanDone() { 10625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan. 10635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->scan_session_.reset(); 10645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie wifi_->ScanDoneTask(); 10655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Make a new |scan_session| so that future scanning is done with the mock. 10665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie InstallMockScanSession(); 10675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie } 10685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie void ReportScanDoneKeepScanSession() { 1069dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal wifi_->ScanDoneTask(); 10703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 10711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal void ReportCurrentBSSChanged(const string &new_bss) { 10721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal wifi_->CurrentBSSChanged(new_bss); 10731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal } 10747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal void ReportStateChanged(const string &new_state) { 10757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal wifi_->StateChanged(new_state); 10767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal } 10775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart void ReportWiFiDebugScopeChanged(bool enabled) { 10785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart wifi_->OnWiFiDebugScopeChanged(enabled); 10795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart } 10807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void RequestStationInfo() { 10817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->RequestStationInfo(); 10827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 10837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) { 10847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart wifi_->OnReceivedStationInfo(nl80211_message); 10857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart } 1086baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore GetLinkStatistics() { 10870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetLinkStatistics(nullptr); 1088baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart } 1089cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal void SetPendingService(const WiFiServiceRefPtr &service) { 1090df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->SetPendingService(service); 1091cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal } 109211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart void SetServiceNetworkRpcId( 109311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const WiFiServiceRefPtr &service, const string &rpcid) { 109411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart wifi_->rpcid_by_service_[service.get()] = rpcid; 109511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart } 10963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan bool RpcIdByServiceIsEmpty() { 10973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan return wifi_->rpcid_by_service_.empty(); 10983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 1099bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal bool SetScanInterval(uint16_t interval_seconds, Error *error) { 1100bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetScanInterval(interval_seconds, error); 1101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal } 1102e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart uint16_t GetScanInterval() { 11030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan return wifi_->GetScanInterval(nullptr); 1104e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 11052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi(bool supplicant_present) { 1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeConfig)); 1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1111a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeScan)); 1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeRegulatory)); 1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SubscribeToEvents( 1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Nl80211Message::kMessageTypeString, 1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NetlinkManager::kEventTypeMlme)); 1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 11195412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _)); 1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1121125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu StringCallback supplicant_name_owner_callback; 1122125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 1123125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu EXPECT_CALL(*dbus_service_proxy_.get(), 1124125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu GetNameOwner(WPASupplicant::kDBusAddr, _, _, _)) 1125125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated), 1126125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu SaveArg<2>(&supplicant_name_owner_callback))); 1127125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu 1128084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan dbus_manager_->Start(); 11292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov wifi_->supplicant_present_ = supplicant_present; 11300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan wifi_->SetEnabled(true); // Start(nullptr, ResultCallback()); 1131125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu if (supplicant_present) 11320951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko // Mimic the callback from |dbus_service_proxy_->GetNameOwner|. 1133125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error()); 11343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 11352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void StartWiFi() { 11362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(true); 11372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11382f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnAfterResume() { 1139787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnAfterResume()); 11402f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal wifi_->OnAfterResume(); 11412f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 11422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal void OnBeforeSuspend() { 1143fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan ResultCallback callback( 1144fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1145fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan wifi_->OnBeforeSuspend(callback); 11462f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal } 1147787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan void OnDarkResume() { 1148787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ResultCallback callback( 1149787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this))); 1150787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan wifi_->OnDarkResume(callback); 1151787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 11523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan void RemoveSupplicantNetworks() { 11533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan wifi_->RemoveSupplicantNetworks(); 11543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void InitiateScan(Device::ScanType scan_type) { 11565d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScan(scan_type); 11573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void InitiateScanInDarkResume(const WiFi::FreqSet &freqs) { 11595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->InitiateScanInDarkResume(freqs); 1160381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan } 11615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan void TriggerPassiveScan(const WiFi::FreqSet &freqs) { 11625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan wifi_->TriggerPassiveScan(freqs); 11633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan } 11642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantAppear() { 1165084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7"); 11662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(wifi_->supplicant_present_); 11672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov void OnSupplicantVanish() { 1169084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr); 11702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(wifi_->supplicant_present_); 11712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov bool GetSupplicantPresent() { 11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov return wifi_->supplicant_present_; 11742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov } 1175687350531096cacc379c209e39e63e5316eee5c0Paul Stewart bool GetIsRoamingInProgress() { 1176687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->is_roaming_in_progress_; 1177687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 1178687350531096cacc379c209e39e63e5316eee5c0Paul Stewart void SetIPConfig(const IPConfigRefPtr &ipconfig) { 1179687350531096cacc379c209e39e63e5316eee5c0Paul Stewart return wifi_->set_ipconfig(ipconfig); 1180687350531096cacc379c209e39e63e5316eee5c0Paul Stewart } 11814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov bool SetBgscanMethod(const string &method) { 11824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ::DBus::Error error; 11834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov return DBusAdaptor::SetProperty( 11844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->mutable_store(), 1185f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan kBgscanMethodProperty, 11864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusAdaptor::StringToVariant(method), 11874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &error); 11884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 11894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 11904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov void AppendBgscan(WiFiService *service, 11914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> *service_params) { 11924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov wifi_->AppendBgscan(service, service_params); 11934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 11944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 1195bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart void ReportCertification(const map<string, ::DBus::Variant> &properties) { 1196bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart wifi_->CertificationTask(properties); 1197bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart } 119810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 1199db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart void ReportEAPEvent(const string &status, const string ¶meter) { 1200db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart wifi_->EAPEventTask(status, parameter); 1201db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart } 1202db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 1203e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void RestartFastScanAttempts() { 1204e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart wifi_->RestartFastScanAttempts(); 1205e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 1206e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 12072d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void SetFastScansRemaining(int num) { 12082d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->fast_scans_remaining_ = num; 12092d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 12102d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 12111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StartReconnectTimer() { 12121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StartReconnectTimer(); 12131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart void StopReconnectTimer() { 12161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart wifi_->StopReconnectTimer(); 12171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart } 12181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 12193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void SetLinkMonitor(LinkMonitor *link_monitor) { 12203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->set_link_monitor(link_monitor); 12213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 1223bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart bool SuspectCredentials(const WiFiServiceRefPtr &service, 12241369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure *failure) { 12251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart return wifi_->SuspectCredentials(service, failure); 12261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart } 12271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 12283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart void OnLinkMonitorFailure() { 12293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart wifi_->OnLinkMonitorFailure(); 12303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart } 12313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 12328e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu void OnUnreliableLink() { 12338e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu wifi_->OnUnreliableLink(); 12348e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu } 12358e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 12367fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanShortInterval(const uint16_t &interval, Error *error) { 1237bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanShortInterval(interval, error); 1238bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1239bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12407fab89734d88724a288e96a9996b15548c5294c7Ben Chan bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) { 1241bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal return wifi_->SetBgscanSignalThreshold(threshold, error); 1242bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 1243bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 12443c898323878e95b40abcfc6c7a993555d4675323Roshan Pius void ReportTDLSDiscoverResponse(const string &peer) { 12453c898323878e95b40abcfc6c7a993555d4675323Roshan Pius wifi_->TDLSDiscoverResponse(peer); 12463c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 12473c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 1248df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 1249df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 1250df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1251df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1252df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 1253df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 1254df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1255df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1256df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 1257df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 1258df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1259df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1260df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 1261df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 1262df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1263df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1264c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 1265c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 1266c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 1267c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 1268c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 1269c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 12703c898323878e95b40abcfc6c7a993555d4675323Roshan Pius void TimeoutTDLSDiscoverCleanupTimer() { 12713c898323878e95b40abcfc6c7a993555d4675323Roshan Pius wifi_->TDLSDiscoverPeerCleanup(); 12723c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 12733c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 1274df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 1275df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 1276df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 1277df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 12783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 12793946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 12803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 12813946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 1282787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 1283787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 1284787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1285787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 128610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 128710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 128810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 128910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 129085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 129185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 129285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 129385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 12943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 12953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 12963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1297d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 1298d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 1299d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 1300d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1301d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 1302d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 1303d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 1304d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1305d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 13063239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 13073239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 13083239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 13093239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 1310af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 1311b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 1312b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 1313b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 13143c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 13153c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 13163c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 13173c5040174273386868cc8dea8044d22c465885d8Paul Stewart 13183946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 13193946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 13203946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 13213946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 13221964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 13231964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 13241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 13251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 13262d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void StartScanTimer() { 13272d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->StartScanTimer(); 13282d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 13292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 1330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan bool ParseWiphyIndex(const Nl80211Message &nl80211_message) { 1331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return wifi_->ParseWiphyIndex(nl80211_message); 1332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; } 1335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1336d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; } 1337d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 1338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan std::set<uint16_t> *GetAllScanFrequencies() { 1339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return &wifi_->all_scan_frequencies_; 1340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1342d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void OnScanStarted(const NetlinkMessage &netlink_message) { 1343d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan wifi_->OnScanStarted(netlink_message); 1344d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan } 1345d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13463cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan bool ScanFailedCallbackIsCancelled() { 13473cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan return wifi_->scan_failed_callback_.IsCancelled(); 13483cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 13493cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 1350fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan MOCK_METHOD1(SuspendCallback, void(const Error &error)); 1351fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 1352e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 13535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 1354fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan MockWakeOnWiFi *wake_on_wifi_; // Owned by |wifi_|. 13555c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 13565c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 13573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1359dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 13603426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 1361f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 13622ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 1363c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 13653c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 13663c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 13673946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 13683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 13703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 13723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 1373626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 13743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 13753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 1376446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 1377446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 13787fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 13793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1380ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 1381ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 1382ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1383f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1384f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 1385084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 1386735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1387735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1388735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 13890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 1390735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 1391bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1394ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1395af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 13963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1398e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1399e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1400e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1401e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1402446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1403446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 14047fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 14053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1406e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1407b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1408261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1409261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1410050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartmap<string, ::DBus::Variant> WiFiObjectTest::CreateBSSProperties( 1411050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1412050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1413050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1414050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1415050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 14183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 14193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 14203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 14213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 14223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 14233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1424a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 14253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 14263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 14283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 14293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 14300654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1431e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 14320654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1433e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 14340654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1435050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1436050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart return bss_properties; 1437050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 1438050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1439050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 1440050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1441050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1442050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1443050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1444050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 1445050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAddedTask( 1446050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bss_path, 1447050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode)); 14483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1451e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1453e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1456a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1457a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1458a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1459a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1461a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1462a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 14639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 14649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 14659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 14669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1468f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1469a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 14739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 14749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 14809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 14819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 14829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 14839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 14849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 14879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 14889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 14899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1491a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1492a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 14939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 14949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 14959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 14969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 14989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 15009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 15019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1503a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 15042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1506a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 15072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 15082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1509a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 15102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1511f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1512a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1517a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1519f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1520a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1521a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1522a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1523a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1524a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1531a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1532a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1534a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1538a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1539a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1540a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1541a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1542a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1543e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1544e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1545e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 15463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 15470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 15510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 15520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15552b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 15562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 15572b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1559227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1560227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1561227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1562227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1563227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1564227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1565227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1566227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1567227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1568227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1569227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1570227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1571227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1572227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1573227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1574227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1575227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15782b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 15790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 15820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1584227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1585227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1586227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1587227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1588227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1589227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1590227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1591227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 15930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 15949cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 15959cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 15969cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 15979cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 15989cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 15999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 16002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16022b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16079cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 16089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 16099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 16109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 16122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16142b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 16150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 16180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 16192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 16232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16262b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 16272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1633549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 16343c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1638549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1639549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1640c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1641549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1642549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1643549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1644ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1650549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1651549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 16520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1653549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1654549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 16555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 16565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 16583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 16593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 16603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 16613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 16623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 16633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1664b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 16653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 16673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 16693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 16735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 16745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 16755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 16765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 16785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 16795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 16805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 16845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1686835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1688835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 16890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 16910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1692835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1693835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 16940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 16950427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 16960427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 16970427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 16980427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 16990427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 17000427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1701381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1702381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1703381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1705381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1706381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1707381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1708381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1709381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1711381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1712381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1713381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1714381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1715381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1716381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1717381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1718381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1719ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1720316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1721316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1722316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1723316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1724b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1725316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1726316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1727316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1728316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1729316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1730316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1731316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1732316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1733316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1734b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1735ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1736ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 17370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1738316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1739316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1740316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1741316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1742b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1743316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1744316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1745ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1746ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1747381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1748381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1750381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1751381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1752381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1753381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1754381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1755381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1756381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1757381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1758381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1759381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1761381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1762381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1763381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1764381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1765381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1766381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1767381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1768381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 17695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 17705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 17713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 17723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 17733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 17743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 17753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 17762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 17773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 17783c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 17793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17803239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 17813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 17845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 17855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 17865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 17875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 17885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 17895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 17905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 17915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 17963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 17973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 17983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 18003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 18015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 18022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 18032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 18043c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1808f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1813c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1815c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1816c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18170951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1827c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1828c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1831c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1835c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1837c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1839c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1840c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18410951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1843c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 18442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1848c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1849c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 18532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1855c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1856c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 18575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 18582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 18592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1862f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 18652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 18675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18700951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 18812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 18872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 18905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 18915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 18922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18960951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 19002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 19015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 19022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 19045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19050951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 19062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 19075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19093cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) { 19103cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan StartScan(WiFi::kScanMethodFull); 19113cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ExpectScanStop(); 19123cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 19133cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ReportScanFailed(); 19143cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 19153cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 19163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19193c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1920ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1921ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19223c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19235c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1924ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1925ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 19262f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1927ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1928ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1929ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 19315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 19390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 19400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 19410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 19463a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 19473a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19483a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19493a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 19503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 19513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 19523a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 19533a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19543a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 19553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 19563a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 19573a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 19583a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19593a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19603a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 19613a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 19625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 19635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1965ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1966ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19673c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1968ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1969ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1971ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1972ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1973ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 19755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 19835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 19875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1989ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1990ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19913c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 19930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 19943c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 19953c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 19963ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1998ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19992f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 2000ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 2001ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 2002ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 20035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 20045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 20055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 20065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 20075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 20090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 20115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 20125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 20130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 20145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2015df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 20165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 20175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 20185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 20195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 20218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 202270068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 20238e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20248e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 20258e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 20268e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20278e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 20288e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 20303c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 20313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2032e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 20333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2034e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 20353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2036e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 20373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2038e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 20397fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 2040e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 2041e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 2042e41a72d0737488d561a4158019409d5785dad61bThieu Le 2043e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 2044e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 2045e41a72d0737488d561a4158019409d5785dad61bThieu Le 2046e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 2047e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 2048e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 2049e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 2050e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 2051e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 2052e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 2053e41a72d0737488d561a4158019409d5785dad61bThieu Le } 2054e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 2055e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 2056e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 2057e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 20583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 20593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 20603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 20613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 20663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 20673c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20713c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 20733c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 20743c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 2075381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan manager()->set_suppress_autoconnect(true); 20763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 2077381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 20783c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 20793c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 2081b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 20820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 2083e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 2084b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 2085e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 2086e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 20878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20898a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 20908a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20913c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20923c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20943c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 2095ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20963c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20973c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 21008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21013c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2102261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 2103261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 2104261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 2105261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 21110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21133c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 21143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 21153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2116835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 2117835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 21190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 2120835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2123835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 21270654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2128835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2129835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 2130a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 2131a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 21323c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 2134835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 2135835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 2136835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 21370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 21380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21393c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 21400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 21413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 21423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21434943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 21444943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21454943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21464943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 21474943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 21480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21494943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 21504943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21514943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 21524943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 21534943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 21540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 21554943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 21564943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21574943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 21610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 21650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 21670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 21683c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 21690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21713c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 21723c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 21733c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21753c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 21760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 21773c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 21813c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 21843c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 21850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 21870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 21880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 21900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21912b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 21920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 21953c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21963c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 21970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21983c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21994943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 22000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 22010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 22020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 22030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 22040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 2205835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2206835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 2207ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 2208af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 2209af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 2210af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 2211af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2212835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 2213735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 22143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22154943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 22164943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22174943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22194943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22204943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 22214943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22224943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 22234943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 22244943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 22250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22264943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22274943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 22284943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22294943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 22304943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 22314943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 22324943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22334943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 2234ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 22354943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 22364943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 22374943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 22384943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 22394943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 22404943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 22414943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22424943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 22434943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22440654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22463c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 22480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 2249c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 22503c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 22513c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 22520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2254c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 22553c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2256c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 2257c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 2258c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 2259c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 22600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 2262c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 2263c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 22640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 22650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 22664943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 22670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22684943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 22690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 22730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 22740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 22750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 22784943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22794943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22804943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 22814943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 22832b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 22841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 22851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 22861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 22870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 22901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 22911aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 22921aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22941aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 22951aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 22961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 22981aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 22990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 23000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 23011aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 23021aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 23031aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 23041aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 23051aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 2306d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2308d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2310d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2312d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2313d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2314d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2315d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2316d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 2317d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2318d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2319d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23200951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2322d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2323d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 2326d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2329d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2330d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 23310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2332d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2333d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2334d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2335d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2336d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2337d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 2338d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 2339d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2340d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 2341d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2342d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2343d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2345d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2346d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2347d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2348d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2349d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 2350d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2351d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 23530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 2354d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 2355d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2356d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2357d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2358d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2359d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2360d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 2361d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2362d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2363d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 2364d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2365d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2366d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23670951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2368d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2369d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2370d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2371d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 237217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 23739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 237417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 237517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 23769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 23779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 237844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 237944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 238017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 238117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 238217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 23830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 23840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 23850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 238617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 238717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 238817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 238933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 239017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 23910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 239244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 2393a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 239444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2395a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 2396a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2397a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 23980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 23990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 24000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 240117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 24020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 240333a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 240433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 24050951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 24060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 24070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 24080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 240917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 241017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 241117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 24122b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 24132b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 24142b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 24153c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24172b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 24182b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 241917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 242017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 24210d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 24220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 24230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 242417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 242517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 242617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 242717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24283c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 24290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 24330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 24343c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 24363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 24370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24423c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 24430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 24443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 24450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 24460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 24470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 24480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 24500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24545c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2455c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 24580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24623c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 24630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 24650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2467c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2468b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2469c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 24705c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 24715c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2472549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24743c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24753c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 2477ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 24783c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 24793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 24813c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 24823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2483549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 24840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2485549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2486549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2487446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 24883c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24893c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 24913c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 24921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24950654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24970654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2499446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 25001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 25010654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 25021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 25041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 25053c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 25061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2507446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2508446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2510a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2512ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2513ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2514ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2515ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2516ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2517ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2518ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2519ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2520ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2521ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2522ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 25233c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 25243c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25253c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 25280654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2530ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2531ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25343c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 25353c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 25363c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 25373c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25383c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 25393c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 25405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 25415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 25423c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 25555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2557ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 25585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25595412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 25605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 25645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 25685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 25695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 25755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25803c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 25815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25835412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2584ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2585ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2586ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2587fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2588fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2589fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2590fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2591fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 25923c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2594fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2595fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2596fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2597fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2598fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2599fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2600fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 26011e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 26021e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 26031e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 26041e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26051e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 26061e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 26071e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 26081e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 26091e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 26101e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26111e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 26121e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 26199f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 26207de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 26215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 26242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2630f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2631df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2634f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 26385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 26395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 26405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 26415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 26425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 26445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 26485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 26495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 265144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 265244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 265344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 265444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 26555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 26569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 26575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 26602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26617de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 26675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 26685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 26695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 26705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 26715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 26725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 26740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 26755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2678a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2679a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 26805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 26820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 26860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 26882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 26892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 26902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 26915412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 26922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 26935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 26952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 26965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 26975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 26980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 26995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 27005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 27010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 27022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 27030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 27042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 27050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 27065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 27075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 27087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 27097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 27107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 27137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 27140654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 27150654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 27167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 27197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 27207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 27217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2722f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 27237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 27250654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 27267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2729d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 27307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 27337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 27347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2735b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2736d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 27377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 27387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2739f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2740bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2741bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2742bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 27437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27440654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 27450654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 27460654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 27477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 27487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 27513c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 27527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27537ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2754a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2755a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2756a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2757a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2758f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2759a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2760a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2761a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2762a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2763a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2764a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2765a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2766a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2767a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2768a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2769a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2770a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2771a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2772a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2773a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2774f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2775a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27760654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 27770654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2778a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2779a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2780a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2781a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2782a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2783a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2785a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2786a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2787a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 27882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2789a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27900654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 27910654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2792a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 27930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2794a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2795a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27961590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 27971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27983c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 27993c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 28000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 28011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 28024943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 28030654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 28040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 28050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2806687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 28081590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 28091590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 28101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 28113c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 28120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 28143c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 28150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 28163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 28171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2818c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2819c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2820c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2821c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 28223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 28233c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 28243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2825bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2826a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 28270654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2829687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28300951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 28310951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 28321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 28331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2834e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2835e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 28360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 28370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 28380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28393c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 28400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28413c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 28423c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 28433c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 28443c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 28453c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2846687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 28470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2848687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2849687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2850687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2851687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2852687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2853687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2854687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2855687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2856687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28570951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2858687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28594eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 28604eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 28618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 28628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28633c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 28640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 28653c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 28668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 28673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 28680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 28693c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 28700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 28718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 287349c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 287449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 287549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 287649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 287749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 28780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 287949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 28800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 288149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 288249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 288349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 288449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 288549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 288649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 288749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 288849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 288949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 28900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 28910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 289249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 289349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 289449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 28958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 28968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 28983c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 28990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 29008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 29018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 29028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 29034a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 29040654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 29059d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 29060654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 29074d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29084d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29094d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 29104d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 29113c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2913a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 29143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 29150654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 29164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 29174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29194a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 29204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 29213c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2923a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 29243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 29254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 29264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 29284a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 29294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2930f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 29314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 29343c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 29350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29370654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 29384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 29423c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 29430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 29464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 29474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 29480654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 29504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 29544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 29554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 29590654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 29604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 29613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29620951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 29654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 29664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 29670654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 29694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 29734a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29755c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 29765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 29770654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 29785c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 29793c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29805c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 29810951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29825c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 29835c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 29845c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 29850654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29865c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 29875c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 29884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2990c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2991c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 29923c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 29930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2994c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2995c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2996c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2997c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2998c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2999c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 30000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3001c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 3002c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3003c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 3004c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 30053c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 30060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 30078f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 3008c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 30098f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 30108f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 30110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 30125519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 30133c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30153c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 30168f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 30178f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 30185519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 30195519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 30203c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30213c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 30223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30230654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3024c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 3025c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3026b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 3027b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 3028b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 3029b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 3030b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 3031b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 3032b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 3033b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 3034b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3035b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 3036b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 3037b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 3038b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 3039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 3040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 3041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 3042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 30433c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 30440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 30450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 30463c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 3047b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 3048b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 3049b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 3050b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3051b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 30525c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 30535c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 30545c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 30555c05b2920be742d518829972127172481722058dmukesh agrawal 30565c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 30575c05b2920be742d518829972127172481722058dmukesh agrawal 30585c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 30595c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 30605c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 30613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 30625c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 30632f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 30645c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 30655c05b2920be742d518829972127172481722058dmukesh agrawal} 30665c05b2920be742d518829972127172481722058dmukesh agrawal 3067402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 3068402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 3069402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30704b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto- 30714b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // connectable services. 3072402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3073402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 3074402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30754b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)); 3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3077402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3078402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 3079402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3080402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3081402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 3082402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30834b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3084402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3085402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3086402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3087402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 3088402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3089402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 3090402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 3091402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3092402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 30934b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3094402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3095402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3096402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 3097402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 30995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 3100b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3102b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3103b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3104b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31067de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3108b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3113b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 31155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 31165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 31185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 31195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 31200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 31225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 31235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 31245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 31265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 31275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3128b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 3129b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3130b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3131b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3132b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3133b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 3135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3141b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3143b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 3144b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3145b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 31463c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 31470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 3148b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3149b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3150b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3151b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3153b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3154b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3155b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) { 31592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EnableFullScan(); 31602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartWiFi(); 31612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ReportScanDone(); 31632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan CancelScanTimer(); 31642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 31652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 31662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true)); 31692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan FireScanTimer(); 31712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); // Do not re-arm. 31732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 31742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3175b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 3176b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3177b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3178b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3179b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 3181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3182b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3184b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 3185b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3192b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3193b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 3194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 3198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 32025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 32035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 32045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 32050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 32065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 32075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 32085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 3209a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 32125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 32135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 32145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 32155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 32165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 32175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3218b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 3219b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3220b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 32215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 32220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 3223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 32243c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 32253c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 32263c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 3227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32293c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 32305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 32310654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3232b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3233b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3234b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3235b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 3236b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3237b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 32380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 3239b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 3240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 32413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32423c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 32430654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3245b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3246b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32473c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 32483c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 32492ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 32502ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 32513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 32522ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 32533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 32543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 32553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 32562ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 32582ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 32593c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 32603c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 3261daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32632ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 32662ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 32672ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 32682ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 32692ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 32712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32732ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 3274a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3275a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu SetCurrentService(service); 32762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 32773c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3278daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 3279daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 32803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32813c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 3282a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu 3283a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu // Service is unreliable, skip reassociate attempt. 3284a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu service->set_unreliable(true); 3285a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3286a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EndsWith("skipping reassociate attempt."))).Times(1); 3287a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 3288a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu OnLinkMonitorFailure(); 3289a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 32913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 32928e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 32938e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 329470068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 32958e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 32968e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 32978e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 32988e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32998e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 33008e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 3301cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 3302f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3303bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 3305cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3306cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3307bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 3308f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 33090654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3310bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3311bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 3312bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 33130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33141369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3315bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 33161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 3317cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3318cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3319f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 3320f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 3321f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 3322f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 3323a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3324f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 3325f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 3326f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 3330f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 3331f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 3332b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3338f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3339f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 33400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3341f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3342f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3347f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3348f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 3349f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 3350f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3351f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3352f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 33550d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33560d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 33650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3368f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33690951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 3372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 3373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3374f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 3375f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 33760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 33770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3379f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 3380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 3381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 33821369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 3383f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3384735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3385735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3386735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 3387735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3388735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3389bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3392bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3393bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 33941369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3395bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 33961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 33970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3398bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3399bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 34000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 34010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3402bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3403bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3404bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 34050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 34061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 34071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 34081369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 3409f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 3410cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 34110654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3412cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3413a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3414bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3415f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 34164943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3417735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3418cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3419f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 34211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 34221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 34231369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 3424f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 34251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 34261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 3427735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3428735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 34294943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3430735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 3431735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 3432735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 3433735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3434735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3435bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3436735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 34371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 343839a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 3439735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 34400654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3441cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3442cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 34431964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 34441964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 34451964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 34461964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 34471964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 34481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3449e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 34511aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 34531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3456e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3457e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3458e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34611aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3475e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3478e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3488e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34931aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 349466bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 349566bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 34960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3502e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3503e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3504e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3505e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3506e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 35151aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 35161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35183c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 35190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 35201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 35271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 35331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 35411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 35431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35447cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 35457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 35497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 35507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 35510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 35527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 35537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35555412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 35717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 35727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 35737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 35747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 35757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 35777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 35825412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 35867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 35897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 35907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 35917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3592baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3593baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3594baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3595baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 35967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 35977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 35987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 35997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 36007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 36017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 36027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 36037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 36047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 36057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 36067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3607baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 36087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3609baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3610baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3611baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3612baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3613baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3614baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3615baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3639baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3640baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3641baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3642baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3643baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 36577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 36587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 36597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 36607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 36618e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 36627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 36637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 36647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3666baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3667baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3668baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3669baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3670baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3671baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3672baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3673baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3674baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3675baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3676baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3677baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3678baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3679baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3680baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3681baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3682baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3683baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3684baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3685baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3686baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3687baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3688baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3689baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3690baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3691baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3692e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3693e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3694e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3695e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3696e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3697e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3698e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3699e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3700e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3701e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3708e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3709e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3711e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3712e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3716e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3717e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3718e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3719e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3720e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3721e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3722e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3723e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3724e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3725e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3726e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3727e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3728e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 37298e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 37308e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3731e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3732e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3733e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3734e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3735e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3736e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 37377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 37387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 37391964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 37401964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 37411964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 37421964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 37431964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SetupConnectedService(DBus::Path(), nullptr, nullptr); 37441964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 37451964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 37461964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 37471964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 37481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 37491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 37502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) { 37512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan // Return immediately if scan interval is 0. 37532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(0, &e); 37542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 37552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37562d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37572d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) { 37592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(1); 37632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, 37642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000)); 37652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) { 37692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(0); 37732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000)); 37742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3777bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3778f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3779bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3780bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3781bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3782bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3783bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3784bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3785bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3786bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3787bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3788bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3789bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3790bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3791bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 37927fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 37930654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3794bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3795bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3796bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3797bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3798bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3799bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3800bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 38010654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3802bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3803bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3805db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3806db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 38073cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) { 38083cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanFailedTask if scan failed. 38093cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 38103cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, 38113cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds)); 38123cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(false); 38133cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_FALSE(ScanFailedCallbackIsCancelled()); 38143cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 38153cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed 38163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // callback if has been dispatched. 38173cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)); 38183cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(true); 38193cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 38203cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 38213cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 3822db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 382311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3824db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3825db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3826735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3827735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3828735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3829735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3830db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3831db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3832db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3833f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3834db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3835735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3836db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3837735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 38380951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3839735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3840db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3841735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3842735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3843735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 38440d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 38450d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38460d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3847735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 384811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 384911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 385011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 385111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 385211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 385311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 385411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 385511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 385611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 385711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 385811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 38590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 38600d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38610d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 386211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 386311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 386411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 386511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 386611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 386711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 386811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 386911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 38700d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 387111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 387211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 387311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 387411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 387511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3876bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3877bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3878c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3879c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3880c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3881c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3882c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3883c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3884c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3885c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3886c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3887c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3888c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3889c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 38906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 38916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 38926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 38936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 38946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 38957fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 38966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 38976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 38986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 39036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 39046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 39056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 39076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 39086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 39096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 39106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 39116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 39126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 39146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 39156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 39166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 39176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 39186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 39206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 39216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 39226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 39236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 39246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 39256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 39267347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 39277347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 39286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39295581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 39305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 39315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 39335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 39345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 39355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 39395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 39405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39410654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 39425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 39485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39490654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 39500654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 39510654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 39520654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 39530654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 39540654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 39550654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 39560654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 39575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 39695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 39705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39710654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 39720654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 39735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 39785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 39795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39800654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 39810654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 39825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 39875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 39885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39890654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 39900654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 39965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 39975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 39995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 40005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 40015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 40025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 400350cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 400450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 400550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 400650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 400750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 4008bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 4009bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 4010bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 4011bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 4012bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4013bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40147fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 4015bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4016bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4017bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4018bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4019bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4020bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4021bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4022bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4023bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 4024bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4025bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40267fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 4027bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4028bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4029bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4030bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4031bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4032bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4033bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4034bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4035bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 4036bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4037bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 4038bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 4039bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4040bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4041bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 4042bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 40430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 40440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40450cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 40469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 4048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4052a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 40557de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 40560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 40570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40630cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 40649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 40660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 40679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 40689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 40699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 40700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4072a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4074a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4075a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 40790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 40800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40860cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 40879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 40880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 40890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 40909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 40919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 40920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4094a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4096a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 41000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 41010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 41020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 41030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 41040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 41050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 41060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 41070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4108df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 41099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4110df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 41119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 41129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 4113df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4114df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 4115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 4117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 41189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4119df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4120df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4122df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 4123df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 4124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 4125df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 4126df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4127df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4128df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4129df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4130df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4131b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 4132b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4133b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 4134df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 4135b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 4136b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4137df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 4138df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4139df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 4140df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4142df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4143b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 4144b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 4145b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 4146b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4147df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 4148df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4150df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 4151df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4153df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4154df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4155df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4156df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 4157df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4158df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4159df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 41600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 41629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 4165a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4166a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4167df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 41680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 4170df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 4172a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4173a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 41749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4175df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4176df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 41810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 4182df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4183df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4184df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 41850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 4186df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4187a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4188a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 41929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4194a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4195df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 4196df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 4198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4202df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4203f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 4204f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4205a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 4206df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 4207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 4209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 42120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 42130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 42140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 42169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 4219df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 4220a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4221a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4222f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 4227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4228df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4233df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4234df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4235df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 4236df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 4237f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 4238a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 4239a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 42402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 4241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 4242a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 4243a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4244a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4245a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 4248a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4249df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4250df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 4251a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 4254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 4255a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4257df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4258df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4259df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 4260df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 4262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 4264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4265df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 4266a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 4267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 4268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 4269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4273df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 42743bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 42753bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 42760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 42773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 42802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 42813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 42823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 42833bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 42857de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 42863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 42873bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 42893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 42912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 42922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 42942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 42952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 42962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 42972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 42982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 42992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 43012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 43022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 43062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 43072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 43092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 43102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 43112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 43122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 43132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 43142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 43152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 43162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 43172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 4320c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 4321df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 4322df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 4323df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4324df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 4325df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4326df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4327df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4328df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4329df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4330df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 4331df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 4332df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4333df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4334df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 4335df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4336df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4337df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4338df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4339df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4340df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 4341df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 4342df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4343df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4344df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 4345df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4346df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 4347df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4348df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4349df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4350df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4351df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 4352df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 4353df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4354df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4355df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4356df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4357df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4358df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4359df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4360df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4361df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 4362df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 4363df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4364df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 4365df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4366c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 4367c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 4368c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 43693c898323878e95b40abcfc6c7a993555d4675323Roshan Pius const char kPeerDummy[] = "66:77:88:99:aa:bb"; 4370c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4371c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4372c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4373c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 4374c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4375c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4376c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4377c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4378c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4379c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 4380c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 4381c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4382c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4383c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4384c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 4385c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 4386c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4387c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4388c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 4389c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 4390c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 4391c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4392c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 4393c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 4394c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4395c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 4396c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4397c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4398c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4399c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 4400c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 4401c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 4402c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 4403c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 4404c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 4405c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 4406c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 4407c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 4408c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 4409c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 4410c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4411c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 4412c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 4413c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4414c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 4415c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4416c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4417c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4418c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 4419c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 4420c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 4421c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4422c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4423c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4424c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4425c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4426c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4427c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4428c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 4429c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4430c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4431c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4432c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4433c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 4434c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4435c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4436c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4437c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4438c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 4439c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4440c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4441c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4442c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4443c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4444c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4445c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4446c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 4447c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4448c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4449c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4450c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4451c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 4452c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4453c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4454c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4455c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4456c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4457c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 4458c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 4459c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 4460c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 4461c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 4462c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 4463c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 4464c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4465c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 4466c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4467c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 4468c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4469c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 4470c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4471c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4472c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4473c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4474c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 44753c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // Status on a peer after discover response should return 44763c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // "Not Connected" till the cleanup timer expiry. 44773c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 44783c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return()); 44793c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 44803c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist)); 44813c898323878e95b40abcfc6c7a993555d4675323Roshan Pius { 44823c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Error error; 44833c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 44843c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 44853c898323878e95b40abcfc6c7a993555d4675323Roshan Pius ReportTDLSDiscoverResponse(kPeer); 44863c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ(kTDLSDisconnectedState, 44873c898323878e95b40abcfc6c7a993555d4675323Roshan Pius PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 44883c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 44893c898323878e95b40abcfc6c7a993555d4675323Roshan Pius TimeoutTDLSDiscoverCleanupTimer(); 44903c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 44913c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 44923c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 44933c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // Status on a peer after discover response should return 44943c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // "Not Existent" after the cleanup timer expires. 44953c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 44963c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return()); 44973c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeerDummy))) 44983c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return()); 44993c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 45003c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist)); 45013c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeerDummy))) 45023c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist)); 45033c898323878e95b40abcfc6c7a993555d4675323Roshan Pius { 45043c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Error error; 45053c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 45063c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45073c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeerDummy, 45083c898323878e95b40abcfc6c7a993555d4675323Roshan Pius &error)); 45093c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45103c898323878e95b40abcfc6c7a993555d4675323Roshan Pius ReportTDLSDiscoverResponse(kPeer); 45113c898323878e95b40abcfc6c7a993555d4675323Roshan Pius TimeoutTDLSDiscoverCleanupTimer(); 45123c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ(kTDLSNonexistentState, 45133c898323878e95b40abcfc6c7a993555d4675323Roshan Pius PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 45143c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ(kTDLSNonexistentState, 45153c898323878e95b40abcfc6c7a993555d4675323Roshan Pius PerformTDLSOperation(kTDLSStatusOperation, kPeerDummy, &error)); 45163c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45173c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 45183c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 45193c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 45203c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // Status on a peer without a discover response should return 45213c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // "Non Existent". 45223c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 45233c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return()); 45243c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 45253c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist)); 45263c898323878e95b40abcfc6c7a993555d4675323Roshan Pius { 45273c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Error error; 45283c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 45293c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45303c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ(kTDLSNonexistentState, 45313c898323878e95b40abcfc6c7a993555d4675323Roshan Pius PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 45323c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45333c898323878e95b40abcfc6c7a993555d4675323Roshan Pius TimeoutTDLSDiscoverCleanupTimer(); 45343c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 45353c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 45363c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 45373c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // Status on a peer without a discover request, but an unexpected discover 45383c898323878e95b40abcfc6c7a993555d4675323Roshan Pius // response should be "Non Existent". 45393c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeerDummy))) 45403c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return()); 45413c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 45423c898323878e95b40abcfc6c7a993555d4675323Roshan Pius .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist)); 45433c898323878e95b40abcfc6c7a993555d4675323Roshan Pius { 45443c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Error error; 45453c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeerDummy, 45463c898323878e95b40abcfc6c7a993555d4675323Roshan Pius &error)); 45473c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45483c898323878e95b40abcfc6c7a993555d4675323Roshan Pius ReportTDLSDiscoverResponse(kPeer); 45493c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_EQ(kTDLSNonexistentState, 45503c898323878e95b40abcfc6c7a993555d4675323Roshan Pius PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 45513c898323878e95b40abcfc6c7a993555d4675323Roshan Pius EXPECT_TRUE(error.IsSuccess()); 45523c898323878e95b40abcfc6c7a993555d4675323Roshan Pius TimeoutTDLSDiscoverCleanupTimer(); 45533c898323878e95b40abcfc6c7a993555d4675323Roshan Pius } 45543c898323878e95b40abcfc6c7a993555d4675323Roshan Pius Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 45553c898323878e95b40abcfc6c7a993555d4675323Roshan Pius 4556c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4557c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4558c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4559c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4560c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4561c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4562c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4563c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4564c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4565c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4566c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4567c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4568c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4569c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4570c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4571c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4572c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4573c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4574c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4575c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4576c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4577c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4578c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4579c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4580c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4581c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4582c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4583c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4584c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4585c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 45863946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 4587235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage new_wiphy_message; 4588235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan new_wiphy_message.InitFromNlmsg( 4589235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg), 4590235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 45913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 4592235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_)); 4593235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex)); 4594235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->clear(); 45953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 4596235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies), 4597235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->size()); 4598235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) { 4599235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(GetAllScanFrequencies()->find(freq) != 4600235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->end()); 4601235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 46023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 46033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 46043946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 46053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 46063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 46073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 46083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 46093946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 46103946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 46113946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 46123946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 46133c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4614787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4615787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4616787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 46174bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 4618787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4619787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4620787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4621787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4622787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4623787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4624787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4625787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4626787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 46273c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 46283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 46293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 46303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 46313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 46323c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4633787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4634787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4635787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4636787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4637787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 4638c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4639c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4640d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 4641787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 4642787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4643787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4644787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 4645787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4646d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 4647787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 46483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 46493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 46503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 46513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 46523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 46533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 46543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 46553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 46563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path1(kNetworkRpcId1); 46573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path2(kNetworkRpcId2); 46583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 46593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 46603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 46613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 46623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 46633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 46643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 46653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 46663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 46675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) { 46685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 46695d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Device::ScanType scan_type = Device::kFullScan; 46705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 46715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 46725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 46735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 46745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 46755d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan scan_type = Device::kProgressiveScan; 46765d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 46775d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 46785d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 46795d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan} 46805d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 46813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 46823fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 46833fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 46843fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 46853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 46863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 46873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 46883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 46893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 46903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 46913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 46923fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 46935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 46943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 46953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 46963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 46973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 46985d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) { 46995d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 47004b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan StartWiFi(); 47015d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 47023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 47035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 47045d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 47055d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 47065d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)); 47075d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 47085d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 47095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_TRUE(manager()->suppress_autoconnect()); 47103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 47113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 47125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) { 47135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 47143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 47155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 47165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SetPendingService(service); 47175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 47185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 47193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 47205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL( 47215d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan log, 47225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 47235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 47245d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 47255d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 47265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)).Times(0); 47275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0); 47285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 47295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 47303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 47313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 47325d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) { 4733381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan ScopedMockLog log; 47345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 47355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 47365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 4737381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_CALL(netlink_manager_, 4738381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4739381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan TriggerScanMessage::kCommand), 4740381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan _, _, _)); 47415d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 47425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 47435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(0); 47445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 47455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 47465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4747381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan} 4748381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan 47495d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) { 47505d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 47515d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 47525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 47535d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs = {1}; 47543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 47553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 47563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 47573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 47585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 47595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 47605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(1); 47615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 47625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 47635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4764787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4765787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4766050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) { 4767050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // This test essentially performs ReportBSS(), but ensures that the 4768050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // WiFi object successfully dispatches events in order. 4769050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart StartWiFi(); 4770050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4771050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss0", 4772050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0, 4773050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4774050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4775050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss1", 4776050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0, 4777050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4778050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSRemoved("bss0"); 4779050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4780050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss2", 4781050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0, 4782050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4783050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4784050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00"); 4785050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 4786050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 4787050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4788050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart InSequence seq; 4789050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))); 4790050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))); 4791050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiServiceRefPtr null_service; 4792050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0))) 4793050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart .WillOnce(Return(null_service)); 4794050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))); 4795050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart dispatcher_.DispatchPendingEvents(); 4796050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 4797050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4798050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 4799050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_EQ(2, endpoints_by_rpcid.size()); 4800050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 4801050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4802235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) { 4803235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag 4804235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // for having the wiphy index is set by ParseWiphyIndex. 4805235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex); 4806235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4807235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg), 4808235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 4809235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(ParseWiphyIndex(msg)); 4810235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex); 4811235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4812235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4813235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) { 4814235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan ScopedMockLog log; 4815235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ 4816235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // U32 attribute, so that this message no longer contains a wiphy_index to be 4817235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // parsed. 4818235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4819235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint8_t message_memory[sizeof(kNewWiphyNlMsg)]; 4820235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan memcpy(message_memory, kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4821235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan struct nlattr *nl80211_attr_wiphy = reinterpret_cast<struct nlattr *>( 4822235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan &message_memory[kNewWiphyNlMsg_Nl80211AttrWiphyOffset]); 4823235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ; 4824235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(message_memory), 4825235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 4826235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4827235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 4828235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY")); 4829235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_FALSE(ParseWiphyIndex(msg)); 4830235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0); 4831235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4832235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4833d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) { 4834d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4835d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4836d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kActiveScanTriggerNlMsg), 4837d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan NetlinkMessage::MessageContext()); 4838d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true)); 4839d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4840d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4841d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4842d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) { 4843d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4844d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4845d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan msg.InitFromNlmsg( 4846d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan reinterpret_cast<const nlmsghdr *>(kPassiveScanTriggerNlMsg), 4847d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan NetlinkMessage::MessageContext()); 4848d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false)); 4849d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4850d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4851d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4852853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4853