wifi_unittest.cc revision 4b8436a5136baa1716ca6a1013e2a4ad38ad2437
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 1244df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSDiscover(const string &peer) { 1245df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSDiscover(peer); 1246df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1247df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1248df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSSetup(const string &peer) { 1249df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSSetup(peer); 1250df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1251df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1252df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart string TDLSStatus(const string &peer) { 1253df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSStatus(peer); 1254df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1255df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1256df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart bool TDLSTeardown(const string &peer) { 1257df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart return wifi_->TDLSTeardown(peer); 1258df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart } 1259df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 1260c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart string PerformTDLSOperation(const string &operation, 1261c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const string &peer, 1262c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error *error) { 1263c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart return wifi_->PerformTDLSOperation(operation, peer, error); 1264c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 1265c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 1266df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie void TimeoutPendingConnection() { 1267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie wifi_->PendingTimeoutHandler(); 1268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie } 1269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 12703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal void OnNewWiphy(const Nl80211Message &new_wiphy_message) { 12713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal wifi_->OnNewWiphy(new_wiphy_message); 12723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 12733946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 1274787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan bool IsConnectedToCurrentService() { 1275787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan return wifi_->IsConnectedToCurrentService(); 1276787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan } 1277787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 127810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart NiceMockControl *control_interface() { 127910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart return &control_interface_; 128010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart } 128110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart 128285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart MockMetrics *metrics() { 128385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart return &metrics_; 128485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart } 128585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart 12863239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal MockManager *manager() { 12873239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return &manager_; 12883239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 1289d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 1290d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDeviceInfo *device_info() { 1291d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &device_info_; 1292d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1293d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 1294d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain MockDHCPProvider *dhcp_provider() { 1295d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain return &dhcp_provider_; 1296d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain } 1297d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain 12983239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal const WiFiConstRefPtr wifi() const { 12993239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal return wifi_; 13003239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal } 13013239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal 1302af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory *proxy_factory() { 1303b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal return &proxy_factory_; 1304b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal } 1305b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 13063c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiProvider *wifi_provider() { 13073c5040174273386868cc8dea8044d22c465885d8Paul Stewart return &wifi_provider_; 13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart } 13093c5040174273386868cc8dea8044d22c465885d8Paul Stewart 13103946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor() { 13113946da840142cd386d628c0e879459f8976bd86dmukesh agrawal return mac80211_monitor_; 13123946da840142cd386d628c0e879459f8976bd86dmukesh agrawal } 13133946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 13141964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan void ReportConnectedToServiceAfterWake() { 13151964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan wifi_->ReportConnectedToServiceAfterWake(); 13161964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan } 13171964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 13182d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan void StartScanTimer() { 13192d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan wifi_->StartScanTimer(); 13202d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan } 13212d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 1322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan bool ParseWiphyIndex(const Nl80211Message &nl80211_message) { 1323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return wifi_->ParseWiphyIndex(nl80211_message); 1324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; } 1327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1328d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; } 1329d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 1330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan std::set<uint16_t> *GetAllScanFrequencies() { 1331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan return &wifi_->all_scan_frequencies_; 1332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 1333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 1334d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan void OnScanStarted(const NetlinkMessage &netlink_message) { 1335d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan wifi_->OnScanStarted(netlink_message); 1336d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan } 1337d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 13383cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan bool ScanFailedCallbackIsCancelled() { 13393cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan return wifi_->scan_failed_callback_.IsCancelled(); 13403cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan } 13413cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 1342fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan MOCK_METHOD1(SuspendCallback, void(const Error &error)); 1343fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan 1344e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher *event_dispatcher_; 13455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie MockScanSession *scan_session_; // Owned by |wifi_|. 1346fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan MockWakeOnWiFi *wake_on_wifi_; // Owned by |wifi_|. 13475c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal NiceMock<MockRTNLHandler> rtnl_handler_; 13485c05b2920be742d518829972127172481722058dmukesh agrawal MockTime time_; 13493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1351dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal NiceMockControl control_interface_; 13523426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le MockMetrics metrics_; 1353f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockGLib glib_; 13542ae797d040b7261a5619c750e07037566bcb542bChris Masone MockManager manager_; 1355c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal MockDeviceInfo device_info_; 13563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal WiFiRefPtr wifi_; 13573c5040174273386868cc8dea8044d22c465885d8Paul Stewart NiceMock<MockWiFiProvider> wifi_provider_; 13583c5040174273386868cc8dea8044d22c465885d8Paul Stewart int bss_counter_; 13593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal MockMac80211Monitor *mac80211_monitor_; // Owned by |wifi_|. 13603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // protected fields interspersed between private fields, due to 13623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal // initialization order 13633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected: 13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kDeviceName[]; 1365626719f89881a949d8b5a8fa808beb924496489fChris Masone static const char kDeviceAddress[]; 13663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeAdHoc[]; 13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal static const char kNetworkModeInfrastructure[]; 1368446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kBSSName[]; 1369446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart static const char kSSIDName[]; 13707fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kRoamThreshold; 13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1372ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockDBusServiceProxy> dbus_service_proxy_; 1373ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_; 1374ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_; 1375f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal MockDHCPProvider dhcp_provider_; 1376f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal scoped_refptr<MockDHCPConfig> dhcp_config_; 1377084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan DBusManager *dbus_manager_; 1378735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart 1379735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // These pointers track mock objects owned by the WiFi device instance 1380735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // and manager so we can perform expectations against them. 13810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie DeviceMockAdaptor *adaptor_; 1382735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart MockSupplicantEAPStateHandler *eap_state_handler_; 1383bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie MockNetlinkManager netlink_manager_; 13843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 13853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private: 1386ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_; 1387af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan MockProxyFactory proxy_factory_; 13883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}; 13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1390e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0"; 1391e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405"; 1392e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc"; 1393e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure"; 1394446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0"; 1395446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0"; 13967fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32; // Arbitrary value. 13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1398e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) { 1399b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal wifi_->BSSRemovedTask(bss_path); 1400261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 1401261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 1402050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartmap<string, ::DBus::Variant> WiFiObjectTest::CreateBSSProperties( 1403050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1404050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1405050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1406050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1407050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 14083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal map<string, ::DBus::Variant> bss_properties; 14093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 14103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["SSID"].writer()); 14113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << vector<uint8_t>(ssid.begin(), ssid.end()); 14123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 14133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal { 14143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal string bssid_nosep; 14153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal vector<uint8_t> bssid_bytes; 1416a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan base::RemoveChars(bssid, ":", &bssid_nosep); 14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal base::HexStringToBytes(bssid_nosep, &bssid_bytes); 14183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 14193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::MessageIter writer(bss_properties["BSSID"].writer()); 14203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal writer << bssid_bytes; 14213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal } 14220654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertySignal].writer(). 1423e41a72d0737488d561a4158019409d5785dad61bThieu Le append_int16(signal_strength); 14240654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyFrequency].writer(). 1425e41a72d0737488d561a4158019409d5785dad61bThieu Le append_uint16(frequency); 14260654ece95920696c530ce1c0344365eb741f7efePaul Stewart bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode); 1427050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1428050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart return bss_properties; 1429050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 1430050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 1431050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path, 1432050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &ssid, 1433050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const string &bssid, 1434050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart int16_t signal_strength, 1435050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart uint16_t frequency, 1436050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const char *mode) { 1437050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart wifi_->BSSAddedTask( 1438050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart bss_path, 1439050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode)); 14403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 14413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 1442e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object. 1443e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest { 1444e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 1445e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart WiFiMainTest() : WiFiObjectTest(&dispatcher_) {} 1446e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 1447e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 1448a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // A progressive scan requests one or more scans, each of which asks about a 1449a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // different batch of frequencies/channels. 1450a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie enum WhichBatchOfProgressiveScan { 1451a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kFirstProgressiveScanBatch, 14522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie kOnlyFullScanBatch, 1453a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie kNotFirstProgressiveScanBatch 1454a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie }; 14559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie void StartScan(WiFi::ScanMethod method) { 14569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (method == WiFi::kScanMethodFull) { 14579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie EnableFullScan(); 14589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 1460f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 1461a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 14622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Using kFirstProgressiveScanBatch regardless of the method since 14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // kFOnlyFullScanBatch does exactly the same thing. 14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(method, false); 14659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartWiFi(); 14669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanScanning, method); 14689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method, 14719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr *endpoint, 14729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path *bss_path) { 14739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFiEndpointRefPtr dummy_endpoint; 14749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!endpoint) { 14759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie endpoint = &dummy_endpoint; // If caller doesn't care about endpoint. 14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ::DBus::Path dummy_bss_path; 14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie if (!bss_path) { 14809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie bss_path = &dummy_bss_path; // If caller doesn't care about bss_path. 14819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 1483a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 1484a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 14859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = 14869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie SetupConnectingService(DBus::Path(), endpoint, bss_path); 14879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie ReportScanDoneKeepScanSession(); 14889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie dispatcher_.DispatchPendingEvents(); 14899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie VerifyScanState(WiFi::kScanConnecting, method); 14909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie return service; 14929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie } 14939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie 14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) { 1495a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie if (method == WiFi::kScanMethodProgressive) { 14962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ASSERT_FALSE(IsScanSessionNull()); 1497a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()); 1498a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 14992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie } else { 15002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1501a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie if (!is_continued) { 1503f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, 1504a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie true)); 1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 1506a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1507a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1508a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1509a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie // Scanning can stop for any reason (including transitioning to connecting). 1510a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanStop() { 1511f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 1512a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnecting() { 1515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 1517a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1519a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectConnected() { 1520a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 1521a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1522a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1523a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1524a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectFoundNothing() { 1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 1526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)); 1527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 1528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie void ExpectScanIdle() { 1531a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetScanTimer(_)); 1532a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation(); 1533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie } 1534a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 1535e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EventDispatcher dispatcher_; 1536e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 1537e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 15383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) { 15390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());; 15413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 15430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 15440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi()); 15453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 15463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 15472b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) { 15482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_FALSE(GetSupplicantPresent()); 15492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1551227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) { 1552227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold16 = 16; 1553227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie static const uint16_t kRoamThreshold32 = 32; 1554227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1555227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie StartWiFi(false); // No supplicant present. 1556227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie OnSupplicantAppear(); 1557227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1558227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1559227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold16)); 1560227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16)); 1561227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16); 1562227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 1563227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie // Try a different number 1564227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 1565227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThreshold(kRoamThreshold32)); 1566227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32)); 1567227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32); 1568227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie} 1569227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) { 15710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(false); // No supplicant present. 15740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie SetRoamThresholdMember(kRoamThreshold); 1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 1578227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 1579227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false)); 1580227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold)); 1581227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_)); 1582227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true)); 1583227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie 15842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 15850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 15869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 15879cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is started, the device should be 15889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // restarted. 15899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 15909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 15919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 15922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 15932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15942b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) { 15950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 15972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 15980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 15999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov 16009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // If supplicant reappears while the device is stopped, the device should not 16019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov // be restarted. 16029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov OnSupplicantAppear(); 16042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16062b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) { 16070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSupplicantProcessProxy());; 16082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov StartWiFi(); 16100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, GetSupplicantProcessProxy()); 16112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)); 16142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), RegisterDevice(_)); 16152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 16182b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) { 16192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantAppear(); 16202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_TRUE(GetSupplicantPresent()); 16212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0); 16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov OnSupplicantVanish(); 16232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov} 16242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov 1625549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) { 16263c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 16283c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 16290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 1630549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart ScopedMockLog log; 1631549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 1632c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 1633549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EndsWith("silently resetting current_service_."))); 1634549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), DeregisterDevice(_)) 1635549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi)); 1636ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 1642549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart EXPECT_CALL(*manager(), RegisterDevice(_)); 1643549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart OnSupplicantVanish(); 16440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 1645549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 1646549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 16475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) { 16485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 16493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 16503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 16513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 16523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 16533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 16543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceUnknown", 16553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 1656b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 16593239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 1660b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 16613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 16623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 16635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) { 16645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)); 16655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)) 16665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 16675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 16685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 16695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 16705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 16715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 16735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 16745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 16755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); 16765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 1678835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) { 16793c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 1680835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart DBus::Path network = "/test/path"; 16810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr)); 16823c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 16830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko ClearCachedCredentials(service.get()); 1684835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 1685835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 16860427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) { 16870427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart WiFiEndpointRefPtr endpoint = 16880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc); 16890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 16900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart NotifyEndpointChanged(endpoint); 16910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart} 16920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart 1693381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) { 1694381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 1695381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 16963c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)); 1697381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1698381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1699381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1700381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) { 1701381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1703381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1704381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1705381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.NetworkUnknown", 1706381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.NetworkUnknown"))); 1707381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1708381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_TRUE(RemoveNetwork(network)); 1709381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1710381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1711ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) { 1712316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart StartWiFi(); 1713316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1714316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // With no selected service. 1715316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1716b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1717316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1718316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1719316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1720316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 1721316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart InitiateConnect(service); 1722316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1723316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that does not have a static IP address. 1724316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false)); 1725316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_TRUE(wifi()->ShouldUseArpGateway()); 1726b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true)) 1727ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray .WillOnce(Return(dhcp_config_)); 1728ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 17290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 1730316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart 1731316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart // Selected service that has a static IP address. 1732316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true)); 1733316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart EXPECT_FALSE(wifi()->ShouldUseArpGateway()); 1734b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false)) 1735316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart .WillOnce(Return(dhcp_config_)); 1736316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart const_cast<WiFi *>(wifi().get())->AcquireIPConfig(); 1737ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray} 1738ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray 1739381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) { 1740381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1742381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1743381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1744381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.InvalidArgs", 1745381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.InvalidArgs"))); 1746381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1747381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1748381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1749381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 1750381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) { 1751381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Path network = "/test/path"; 17523c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network)) 1753381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan .WillRepeatedly(Throw( 1754381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan DBus::Error( 1755381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "fi.w1.wpa_supplicant1.UnknownError", 1756381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan "test threw fi.w1.wpa_supplicant1.UnknownError"))); 1757381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan StartWiFi(); 1758381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan EXPECT_FALSE(RemoveNetwork(network)); 1759381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan} 1760381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan 17615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) { 17625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 17633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 17643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .Times(AnyNumber()) 17653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal .WillRepeatedly(Throw( 17663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal DBus::Error( 17673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal "fi.w1.wpa_supplicant1.InterfaceExists", 17682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 17693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_)); 17703c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 17713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17723239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal dispatcher_.DispatchPendingEvents(); 17733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) { 17765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_)) 17775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .Times(AnyNumber()) 17785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Throw( 17795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie DBus::Error( 17805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceExists", 17815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceExists"))); 17825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 17835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 17845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 17855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 17865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 17873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) { 17883c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks()); 17893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)); 17903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 17913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 17923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 17935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) { 17942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 17952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 17963c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 17972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 17982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 17992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1800f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull); 18032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 1805c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1807c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1808c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18090951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1819c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1820c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18210951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1823c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // Similarly, ignore scans when our connected service is reconnecting. 18242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 1827c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley SetCurrentService(service); 18283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 1829c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1831c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1832c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18330951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 1835c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley // But otherwise we'll honor the request. 18362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)). 18372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie WillRepeatedly(Return(false)); 18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodFull, false); 18392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 1840c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley dispatcher_.DispatchPendingEvents(); 1841c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 18420951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Silence messages from the destructor. 18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 1847c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley} 1848c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley 18495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) { 18502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Setup 'connecting' state. 18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 18522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectConnecting(); 1854f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 18552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InitiateConnect(service); 18562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 18572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // If we're connecting, we ignore scan requests and stay on channel. 18595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18620951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Terminate the scan. 18662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectFoundNothing(); 18672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TimeoutPendingConnection(); 18682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 18692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Start a fresh scan. 18712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 18732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Similarly, ignore scans when our connected service is reconnecting. 18792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 18802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 18810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 18825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetCurrentService(service); 18835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true)); 18842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie InstallMockScanSession(); 18852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18880951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 18912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Unlike Full scan, Progressive scan will reject attempts to scan while 18922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // we're connected. 18935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false)); 18942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 18952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 18965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 18970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 18982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie Mock::VerifyAndClearExpectations(scan_session_); 18995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19013cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) { 19023cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan StartScan(WiFi::kScanMethodFull); 19033cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ExpectScanStop(); 19043cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 19053cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ReportScanFailed(); 19063cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 19073cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 19083cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 19095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) { 19105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19113c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1912ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1913ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19143c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19155c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 1916ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1917ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 19182f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1919ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1920ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1921ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) { 19235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 19285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 19310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_NE(nullptr, scan_session_);; 19320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie InstallMockScanSession(); 19330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19373a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) { 19383a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan StartWiFi(); 19393a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19403a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19413a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ReportScanDone(); 19423fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan CancelScanTimer(); 19433fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 19443a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan ASSERT_TRUE(wifi()->IsIdle()); 19453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19463a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan OnAfterResume(); 19473fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(GetScanTimer().IsCancelled()); 19483a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan InstallMockScanSession(); 19493a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan SetCurrentService(MakeMockService(kSecurityNone)); 19503a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19513a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan dispatcher_.DispatchPendingEvents(); 19523a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan} 19533a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan 19545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) { 19555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1957ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1958ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19593c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 1960ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain ASSERT_TRUE(wifi()->IsIdle()); 1961ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19622f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnBeforeSuspend(); 1963ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1964ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1965ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) { 19675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ASSERT_TRUE(wifi()->IsIdle()); 19725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 19745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnBeforeSuspend(); 19755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 19775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 19785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) { 19795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 1981ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain StartWiFi(); 1982ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 19833c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 19840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 19850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 19863c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_FALSE(wifi()->IsIdle()); 19873c5040174273386868cc8dea8044d22c465885d8Paul Stewart ScopedMockLog log; 19883ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 19890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 1990ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 19912f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 1992ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain dispatcher_.DispatchPendingEvents(); 1993ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain} 1994ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain 19955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) { 19965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 19975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 19985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 19995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service( 20010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 20025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(wifi()->IsIdle()); 20035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 20045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 20050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected."))); 20065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2007df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 20085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnAfterResume(); 20095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 20105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 20115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 20128e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) { 20138e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 201470068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 20158e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20168e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1); 20178e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnAfterResume(); 20188e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 20198e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 20208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 20213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) { 20223c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5); 20233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 2024e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 20253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2026e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure); 20273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2028e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure); 20293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportBSS( 2030e41a72d0737488d561a4158019409d5785dad61bThieu Le "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure); 20317fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint16_t frequency = 2412; 2032e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency, 2033e41a72d0737488d561a4158019409d5785dad61bThieu Le kNetworkModeAdHoc); 2034e41a72d0737488d561a4158019409d5785dad61bThieu Le 2035e41a72d0737488d561a4158019409d5785dad61bThieu Le const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 2036e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(5, endpoints_by_rpcid.size()); 2037e41a72d0737488d561a4158019409d5785dad61bThieu Le 2038e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFi::EndpointMap::const_iterator i; 2039e41a72d0737488d561a4158019409d5785dad61bThieu Le WiFiEndpointRefPtr endpoint; 2040e41a72d0737488d561a4158019409d5785dad61bThieu Le for (i = endpoints_by_rpcid.begin(); 2041e41a72d0737488d561a4158019409d5785dad61bThieu Le i != endpoints_by_rpcid.end(); 2042e41a72d0737488d561a4158019409d5785dad61bThieu Le ++i) { 2043e41a72d0737488d561a4158019409d5785dad61bThieu Le if (i->second->bssid_string() == "00:00:00:00:00:04") 2044e41a72d0737488d561a4158019409d5785dad61bThieu Le break; 2045e41a72d0737488d561a4158019409d5785dad61bThieu Le } 2046e41a72d0737488d561a4158019409d5785dad61bThieu Le ASSERT_TRUE(i != endpoints_by_rpcid.end()); 2047e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(4, i->second->signal_strength()); 2048e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ(frequency, i->second->frequency()); 2049e41a72d0737488d561a4158019409d5785dad61bThieu Le EXPECT_EQ("adhoc", i->second->network_mode()); 20503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 20513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 20523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) { 20533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal StartWiFi(); 20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00", 20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1); 20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1); 20603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1); 20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0, 20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeAdHoc); 20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0, 20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0, 20663c5040174273386868cc8dea8044d22c465885d8Paul Stewart kNetworkModeInfrastructure); 2067381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan manager()->set_suppress_autoconnect(true); 20683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal ReportScanDone(); 2069381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 20713c5040174273386868cc8dea8044d22c465885d8Paul Stewart 20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0); 2073b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 20740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // BSSes with SSIDs that start with nullptr should be filtered. 2075e41a72d0737488d561a4158019409d5785dad61bThieu Le ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 2076b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal 2077e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal // BSSes with empty SSIDs should be filtered. 2078e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc); 20798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 20808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 20818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) { 20828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 20853c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 2087ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 20883c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 20893c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 20903c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 20913c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 20928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 2094261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal} 2095261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal 2096261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) { 2097261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal StartWiFi(); 20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path; 21003c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 21013c5040174273386868cc8dea8044d22c465885d8Paul Stewart SetupConnectedService(DBus::Path(), &endpoint, &bss_path)); 21023c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 21030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 21043c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21053c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 21063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal} 21073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal 2108835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) { 2109835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart StartWiFi(); 21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath = "/test/path"; 21110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 2112835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2113835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Return the service to a connectable state. 21143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2115835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateDisconnect(service); 21163c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21173c5040174273386868cc8dea8044d22c465885d8Paul Stewart 21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart // Complete the disconnection by reporting a BSS change. 21190654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2120835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // A second connection attempt should remember the DBus path associated 2122a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart // with this service, and should not request new configuration parameters. 2123a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0); 21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0); 21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath)); 2126835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart InitiateConnect(service); 2127835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart} 2128835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 21290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) { 21300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21313c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 21320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_TRUE(GetPendingService() == service.get()); 21343c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21354943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 21364943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21374943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21384943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 21394943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(service.get()); 21400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21414943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 21424943822214f823c2437aa32b0376414b3e60388dPeter Qiu 21434943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) { 21444943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 21454943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service( 21460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 21474943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_TRUE(GetPendingService() == service.get()); 21484943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21494943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 21503c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21523c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service.get()); 21530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService());; 21540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) { 21570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 21590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0, GetCurrentService()); 21610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21633c5040174273386868cc8dea8044d22c465885d8Paul Stewart // We don't explicitly call Disconnect() while transitioning to a new 21643c5040174273386868cc8dea8044d22c465885d8Paul Stewart // service. Instead, we use the side-effect of SelectNetwork (verified in 21653c5040174273386868cc8dea8044d22c465885d8Paul Stewart // SetupConnectingService). 21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 21673c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 21680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService("/new/path", nullptr, nullptr)); 21693c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 21700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 21733c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1)); 21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service1); 21763c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(service1.get()); 21770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| will be unchanged until supplicant signals 21790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // that CurrentBSS has changed. 21800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 21810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |pending_service_| is updated immediately. 21820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 21832b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(GetPendingTimeout().IsCancelled()); 21840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 21850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) { 21873c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 21883c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 21890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 21903c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 21914943822214f823c2437aa32b0376414b3e60388dPeter Qiu service->set_expecting_disconnect(true); 21920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 21930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 21940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // |current_service_| should not change until supplicant reports 21950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal // a BSS change. 21960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service, GetCurrentService()); 2197835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart 2198835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart // Expect that the entry associated with this network will be disabled. 2199ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 2200af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan new MockSupplicantNetworkProxy()); 2201af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan EXPECT_CALL(*proxy_factory(), 2202af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 2203af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan .WillOnce(ReturnAndReleasePointee(&network_proxy)); 2204835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart EXPECT_CALL(*network_proxy, SetEnabled(false)); 2205735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 22063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22074943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(_)).Times(0); 22084943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22094943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22114943822214f823c2437aa32b0376414b3e60388dPeter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22124943822214f823c2437aa32b0376414b3e60388dPeter Qiu} 22134943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22144943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) { 22154943822214f823c2437aa32b0376414b3e60388dPeter Qiu StartWiFi(); 22164943822214f823c2437aa32b0376414b3e60388dPeter Qiu ::DBus::Path kPath("/fake/path"); 22170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22184943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22194943822214f823c2437aa32b0376414b3e60388dPeter Qiu InitiateDisconnect(service); 22204943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22214943822214f823c2437aa32b0376414b3e60388dPeter Qiu // |current_service_| should not change until supplicant reports 22224943822214f823c2437aa32b0376414b3e60388dPeter Qiu // a BSS change. 22234943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_EQ(service, GetCurrentService()); 22244943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22254943822214f823c2437aa32b0376414b3e60388dPeter Qiu // Expect that the entry associated with this network will be disabled. 2226ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<MockSupplicantNetworkProxy> network_proxy( 22274943822214f823c2437aa32b0376414b3e60388dPeter Qiu new MockSupplicantNetworkProxy()); 22284943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*proxy_factory(), 22294943822214f823c2437aa32b0376414b3e60388dPeter Qiu CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr)) 22304943822214f823c2437aa32b0376414b3e60388dPeter Qiu .WillOnce(ReturnAndReleasePointee(&network_proxy)); 22314943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*network_proxy, SetEnabled(false)); 22324943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*eap_state_handler_, Reset()); 22334943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0); 22344943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange)); 22354943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22360654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22383c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 22400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 2241c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) { 22423c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 22433c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 22440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22453c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 2246c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError))); 22473c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2248c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley InitiateDisconnect(service); 2249c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 2250c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // We may sometimes fail to disconnect via supplicant, and we patch up some 2251c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley // state when this happens. 22520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 2254c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley} 2255c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley 22560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) { 22570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 22584943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 22590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22604943822214f823c2437aa32b0376414b3e60388dPeter Qiu MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), 22610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 22620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22643c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 22650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service0); 22660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 22670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service0, GetCurrentService()); 22680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal EXPECT_EQ(service1, GetPendingService()); 22692b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(GetPendingTimeout().IsCancelled()); 22704943822214f823c2437aa32b0376414b3e60388dPeter Qiu 22714943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 22724943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service0, SetFailure(_)).Times(0); 22734943822214f823c2437aa32b0376414b3e60388dPeter Qiu ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 22742b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart} 22752b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart 22761aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) { 22771aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal StartWiFi(); 22781aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal DBus::Path kPath("/fake/path"); 22790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 22801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22811aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // As it roams to another AP, supplicant signals that it is in 22821aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // the authenticating state. 22831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 22841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 22861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 22871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal InitiateDisconnect(service); 22881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Because the interface was not connected, we should have immediately 22901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // forced ourselves into a disconnected state. 22910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 22920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetSelectedService().get()); 22931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 22941aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal // Check calls before TearDown/dtor. 22951aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 22961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal} 22971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal 2298d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) { 2299d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2300d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2302d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2303d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2304d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2305d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2306d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2308d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).Times(0); 2309d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2310d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23120951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2313d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2314d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2315d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2316d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2317d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) { 2318d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2319d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2322d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(), 23230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2326d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2328d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2329d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false)); 2330d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1); 2331d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2332d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(0); 2333d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2334d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2335d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2337d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2338d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2339d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2340d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2341d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) { 2342d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein StartWiFi(); 2343d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), 23440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan nullptr, nullptr)); 23450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 2346d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ResetPendingService(); 2347d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein NiceScopedMockLog log; 2348d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2349d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(2); 2350d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, 2351d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("DisconnectFromIfActive service"))).Times(1); 2352d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true)); 2353d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1); 2354d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein EXPECT_CALL(log, Log(logging::LOG_WARNING, _, 2355d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein HasSubstr("In DisconnectFrom():"))).Times(1); 2356d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein InitiateDisconnectIfActive(service0); 2357d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 2358d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein Mock::VerifyAndClearExpectations(&log); 23590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 2360d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->set_verbose_level(0); 2361d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2362d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein} 2363d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein 236417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) { 23659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 236617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 236717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 23689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 23699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, nullptr, nullptr); 237044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 237144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Timeout the connection attempt. 237217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 237317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_EQ(service, GetPendingService()); 237417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // Simulate a service with a wifi_ reference calling DisconnectFrom(). 23750d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 23760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 23770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))) 237817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService)); 237917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).Times(0); 238017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should not be called directly from WiFi. 238133a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1); 238217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 23830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 238444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // Innocuous redundant call to NotifyDeviceScanFinished. 2385a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 238644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 2387a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 2388a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 2389a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 23900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 23910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, 23920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 239317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart pending_timeout.callback().Run(); 23940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 239533a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu // Service state should be idle, so it is connectable again. 239633a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu EXPECT_EQ(Service::kStateIdle, service->state()); 23970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 23980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 23990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 24000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 240117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart} 240217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart 240317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) { 24042b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart StartWiFi(); 24052b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart const base::CancelableClosure &pending_timeout = GetPendingTimeout(); 24062b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_TRUE(pending_timeout.IsCancelled()); 24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 24092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_FALSE(pending_timeout.IsCancelled()); 24102b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart EXPECT_EQ(service, GetPendingService()); 241117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // We expect the service to get a disconnect call, but in this scenario 241217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // the service does nothing. 24130d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 24140d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 24150d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("PendingTimeoutHandler"))); 241617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false)); 241717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart // DisconnectFrom() should be called directly from WiFi. 241817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 241917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24203c5040174273386868cc8dea8044d22c465885d8Paul Stewart pending_timeout.callback().Run(); 24210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 24220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) { 24250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal StartWiFi(); 24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 24270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 24283c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0); 24290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) { 24333c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24343c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path kPath("/fake/path"); 24350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr)); 24363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()) 24370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal .WillRepeatedly(Throw( 24380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal DBus::Error( 24390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "fi.w1.wpa_supplicant1.NotConnected", 24400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal "test threw fi.w1.wpa_supplicant1.NotConnected"))); 24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)); 24420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal InitiateDisconnect(service); 24430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 24440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal} 24450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal 24465c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) { 2447c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 24483c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint0; 24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path kPath("/fake/path"); 24500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr)); 24513c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint1; 24520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr); 24533c5040174273386868cc8dea8044d22c465885d8Paul Stewart 24543c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0))) 24550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1))) 24570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan .WillOnce(Return(nullptr)); 24583c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1); 2459c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StopWiFi(); 2460b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 2461c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs()); 24625c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal} 24635c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal 2464549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) { 24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24663c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 24673c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiServiceRefPtr service( 24680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr)); 2469ef76af866aa73abb8c16958844cb13f042881bcbBen Chan unique_ptr<EndpointRemovalHandler> handler( 24703c5040174273386868cc8dea8044d22c465885d8Paul Stewart MakeEndpointRemovalHandler(service)); 24713c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint))) 24723c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Invoke(handler.get(), 24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart &EndpointRemovalHandler::OnEndpointRemoved)); 24743c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 2475549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart StopWiFi(); 24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService());; 2477549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart} 2478549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart 2479446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) { 24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 24813c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 24820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 24833c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 24841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24850654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24870654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 24881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24890654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24901aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 2491446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart ReportCurrentBSSChanged(kBSSName); 24921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 24930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected); 24941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled()); 24953c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 24961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 24973c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 24981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled()); 2499446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart} 2500446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart 25015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") { 2502a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart map<string, DBus::Variant>::const_iterator it = 25030654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 2504ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart if (it == arg.end()) { 2505ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart return false; 2506ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart } 2507ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2508ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const DBus::Variant &ssids_variant = it->second; 2509ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature())); 2510ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart const ByteArrays &ssids = it->second.operator ByteArrays(); 2511ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // A valid Scan containing a single hidden SSID should contain 2512ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // two SSID entries: one containing the SSID we are looking for, 2513ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // and an empty entry, signifying that we also want to do a 2514ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart // broadcast probe request for all non-hidden APs as well. 25153c5040174273386868cc8dea8044d22c465885d8Paul Stewart return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty(); 25163c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25173c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") { 25193c5040174273386868cc8dea8044d22c465885d8Paul Stewart map<string, DBus::Variant>::const_iterator it = 25200654ece95920696c530ce1c0344365eb741f7efePaul Stewart arg.find(WPASupplicant::kPropertyScanSSIDs); 25213c5040174273386868cc8dea8044d22c465885d8Paul Stewart return it == arg.end(); 2522ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2523ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 25245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) { 25255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25263c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 25283c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25303c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 25313c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 25343c5040174273386868cc8dea8044d22c465885d8Paul Stewart dispatcher_.DispatchPendingEvents(); 25353c5040174273386868cc8dea8044d22c465885d8Paul Stewart} 25363c5040174273386868cc8dea8044d22c465885d8Paul Stewart 25375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) { 25405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids)); 2549ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart StartWiFi(); 25505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25515412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _)); 25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) { 25565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 25575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillOnce(Return(ByteArrays())); 25605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan())); 25615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 25625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 25635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 25645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc 25655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list. 25665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) { 25675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Clear the Mock ScanSession because hidden SSIDs are added when wifi 25685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // instantiates a new ScanSession (and it won't instantiate a new ScanSession 25695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // if there's already one there). 25705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ClearScanSession(); 25713c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 25723c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillOnce(Return(ByteArrays())); 25735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 25745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(netlink_manager_, 25755412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _)); 2576ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart dispatcher_.DispatchPendingEvents(); 2577ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart} 2578ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart 2579fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) { 2580fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart ScopedMockLog log; 2581fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 2582fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart EXPECT_CALL(log, Log(_, _, EndsWith( 2583fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart "Ignoring scan request while device is not enabled."))).Times(1); 25843c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 25855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2586fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StartWiFi(); 2587fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart StopWiFi(); 2588fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart // A scan is queued when WiFi resumes. 2589fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart OnAfterResume(); 2590fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart dispatcher_.DispatchPendingEvents(); 2591fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart} 2592fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart 25931e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) { 25941e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal StartWiFi(); 25951e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal ReportScanDone(); 25961e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 25971e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 25981e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)) 25991e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal .WillOnce(Throw(DBus::Error("don't care", "don't care"))); 26001e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal TriggerScan(WiFi::kScanMethodFull); 26011e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal dispatcher_.DispatchPendingEvents(); 26021e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26031e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal} 26041e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal 26055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) { 26065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 26075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 26085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 26095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 26119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 26127de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (connects afterwards). 26162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Connect after second scan. 2622f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2623df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 2624df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 2625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 2626f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetPendingService(service); 26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Verify that the third scan aborts and there is no further scan. 26305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ScopedMockLog log; 26315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 26325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(log, Log(_, _, EndsWith( 26335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie "Ignoring scan request while connecting to an AP."))).Times(1); 26345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) { 26395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Set min & max scan frequency count to 1 so each scan will be of a single 26405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // frequency. 26415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie SetScanSize(1, 1); 26425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 264344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie // This test never connects 264444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0); 264544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 264644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie 26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the first scan (finds nothing). 26489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 26495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the second scan (finds nothing). 26522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, true); 26537de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0); 26545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 26565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // Do the third scan. After (simulated) exhausting of search frequencies, 26595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // verify that this scan uses supplicant rather than internal (progressive) 26605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // scan. 26615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false)); 26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 26635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 26645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 26650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, 26660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFi::kScanMethodProgressiveFinishedToFull); 26675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // And verify that ScanDone reports a complete scan (i.e., the 26695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie // wifi_::scan_session_ has truly been cleared). 2670a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 2671a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 26725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDoneKeepScanSession(); 26730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 26740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) { 26780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ClearScanSession(); // Clear Mock ScanSession to get an actual ScanSession. 26802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartWiFi(); // Posts |ProgressiveScanTask|. 26812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 26822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(netlink_manager_, SendNl80211Message( 26835412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _)); 26842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); // Executes |ProgressiveScanTask|. 26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask| 26872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 26885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie NewScanResultsMessage not_supposed_to_get_this_message; 26895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie OnTriggerScanResponse(not_supposed_to_get_this_message); 26900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull); 26915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 26925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 26930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 26942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Post and execute |UpdateScanStateAfterScanDone|. 26950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDoneKeepScanSession(); 26962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 26970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 26985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 26995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 27007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) { 27017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState()); 27027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) { 27057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // State change should succeed even if there is no pending Service. 27060654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateScanning); 27070654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState()); 27087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) { 27117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Forward transition should trigger a Service state change. 27127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 27137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2714f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 27157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating)); 27170654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAssociated); 27187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal Mock::VerifyAndClearExpectations(service.get()); 2721d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber()); 27227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 27247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) { 27257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Some backwards transitions should not trigger a Service state change. 27267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Supplicant state should still be updated, however. 2727b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 2728d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 27297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal StartWiFi(); 27307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal dispatcher_.DispatchPendingEvents(); 2731f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2732bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 2733bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 2734bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 27357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal InitiateConnect(service); 27360654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 27370654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating); 27380654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating, 27397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal GetSupplicantState()); 27407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // Verify expectations now, because WiFi may report other state changes 27417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal // when WiFi is Stop()-ed (during TearDown()). 27420951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 27433c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, SetState(_)).Times(AnyNumber()); 27447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal} 27457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal 2746a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) { 2747a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2748a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2749a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2750f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2751a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 2752a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 2753a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2754a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(false)); 2755a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2756a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2757a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2758a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) { 2759a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // Turn of WiFi debugging, so the only reason we will turn on supplicant 2760a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // debugging will be to debug a problematic connection. 2761a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 2762a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2763a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 2764a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart StartWiFi(); 2765a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart dispatcher_.DispatchPendingEvents(); 2766f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 2767a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27680654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 27690654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 2770a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 2771a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*service.get(), HasRecentConnectionIssues()) 2772a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .WillOnce(Return(true)); 2773a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart InitiateConnect(service); 2774a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 2775a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetPendingService(nullptr); 2777a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart SetCurrentService(service); 2778a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 2779a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart // When we disconnect from the troubled service, we should reduce the 27802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // level of supplicant debugging. 2781a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 27820654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 27830654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 2784a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart .Times(1); 27850654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 2786a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart} 2787a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart 27881590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) { 27891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 27903c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 27913c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 27920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), &endpoint, nullptr); 27931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 27944943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1)); 27950654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 27960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 27970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 2798687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 27991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 28001590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 28011590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) { 28021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal StartWiFi(); 28033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0 = 28040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28053c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1; 28063c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path1(MakeNewEndpointAndService( 28070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 0, 0, kNetworkModeAdHoc, nullptr, &service1)); 28083c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetCurrentService().get()); 28091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2810c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Note that we deliberately omit intermediate supplicant states 2811c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // (e.g. kInterfaceStateAssociating), on the theory that they are 2812c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // unreliable. Specifically, they may be quashed if the association 2813c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // completes before supplicant flushes its changed properties. 28143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1)); 28153c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path1); 28163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service1, SetState(Service::kStateConfiguring)); 2817bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service1, ResetSuspectedCredentialFailures()); 2818a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_)); 28190654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetCurrentService().get()); 2821687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28220951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service0.get()); 28230951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service1.get()); 28241590839e44a0e922d4763003a35dbd493509b705mukesh agrawal} 28251590839e44a0e922d4763003a35dbd493509b705mukesh agrawal 2826e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) { 2827e41a72d0737488d561a4158019409d5785dad61bThieu Le StartWiFi(); 28280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 28290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 28300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 28313c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 28320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 28333c5040174273386868cc8dea8044d22c465885d8Paul Stewart WiFiEndpointRefPtr endpoint; 28343c5040174273386868cc8dea8044d22c465885d8Paul Stewart ::DBus::Path bss_path = 28353c5040174273386868cc8dea8044d22c465885d8Paul Stewart AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint); 28363c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 28373c5040174273386868cc8dea8044d22c465885d8Paul Stewart ReportCurrentBSSChanged(bss_path); 2838687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_TRUE(GetIsRoamingInProgress()); 28390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 2840687350531096cacc379c209e39e63e5316eee5c0Paul Stewart 2841687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // If we report a "completed" state change on a connected service after 2842687350531096cacc379c209e39e63e5316eee5c0Paul Stewart // wpa_supplicant has roamed, we should renew our IPConfig. 2843687350531096cacc379c209e39e63e5316eee5c0Paul Stewart scoped_refptr<MockIPConfig> ipconfig( 2844687350531096cacc379c209e39e63e5316eee5c0Paul Stewart new MockIPConfig(control_interface(), kDeviceName)); 2845687350531096cacc379c209e39e63e5316eee5c0Paul Stewart SetIPConfig(ipconfig); 2846687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 2847687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_CALL(*ipconfig, RenewIP()); 2848687350531096cacc379c209e39e63e5316eee5c0Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 28490951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(ipconfig.get()); 2850687350531096cacc379c209e39e63e5316eee5c0Paul Stewart EXPECT_FALSE(GetIsRoamingInProgress()); 28514eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal} 28524eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal 28538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) { 28548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28553c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service0( 28560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 28573c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service0.get(), GetPendingService().get()); 28588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 28593c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service1( 28600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 28613c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_EQ(service1.get(), GetPendingService().get()); 28620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 28638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28648a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 286549c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) { 286649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu StartWiFi(); 286749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ::DBus::Path bss_path; 286849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connecting two different services back-to-back. 286949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr unintended_service( 28700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, &bss_path)); 287149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu MockWiFiServiceRefPtr intended_service( 28720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 287349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 287449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service. 287549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(intended_service.get(), GetPendingService().get()); 287649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 287749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Connected to the unintended service (service0). 287849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu ReportCurrentBSSChanged(bss_path); 287949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 288049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // Verify the pending service is disconnected, and the service state is back 288149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu // to idle, so it is connectable again. 28820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetPendingService().get()); 28830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 288449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu EXPECT_EQ(Service::kStateIdle, intended_service->state()); 288549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu} 288649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu 28878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) { 28888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal StartWiFi(); 28898a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_TRUE(wifi()->IsIdle()); 28903c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 28910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 28928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal EXPECT_FALSE(wifi()->IsIdle()); 28938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal} 28948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal 28954a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") { 28960654ece95920696c530ce1c0344365eb741f7efePaul Stewart return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) && 28979d97b7deda3ae604d718873207a951f62d418b34Paul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) && 28980654ece95920696c530ce1c0344365eb741f7efePaul Stewart ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan; 28994d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29004d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29014d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) { 29024d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal StartWiFi(); 29033c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2905a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 29063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true))); 29070654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 29084d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal InitiateConnect(service); 29094d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal} 29104d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal 29114a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) { 29124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 29133c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service; 29140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service); 2915a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 29163c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false))); 29174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov InitiateConnect(service); 29184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 29204a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) { 29214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov StartWiFi(); 2922f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 29234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 1 endpoint, default bgscan method -- background scan disabled. 29254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 29263c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1)); 29270951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29290654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan)); 29304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // 2 endpoints, default bgscan method -- background scan frequency reduced. 29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov map<string, DBus::Variant> params; 29343c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2)); 29350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 29384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 29394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 29400654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 29424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]); 29464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds), 29474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov { 29504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov // Explicit bgscan method -- regular background scan frequency. 29510654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple)); 29524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov std::map<std::string, DBus::Variant> params; 29533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29540951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko AppendBgscan(service.get(), ¶ms); 29550951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov string config_string; 29574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_TRUE( 29584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov DBusProperties::GetString(params, 29590654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov &config_string)); 29614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov vector<string> elements; 29624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov base::SplitString(config_string, ':', &elements); 29634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov ASSERT_EQ(4, elements.size()); 29644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds), 29654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov elements[3]); 29664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov } 29675c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley { 29685c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley // No scan method, simply returns without appending properties 29690654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone)); 29705c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley std::map<std::string, DBus::Variant> params; 29713c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, GetEndpointCount()).Times(0); 29725c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley AppendBgscan(service.get(), ¶ms); 29730951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 29745c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley string config_string; 29755c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley EXPECT_FALSE( 29765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley DBusProperties::GetString(params, 29770654ece95920696c530ce1c0344365eb741f7efePaul Stewart WPASupplicant::kNetworkPropertyBgscan, 29785c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley &config_string)); 29795c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley } 29804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov} 29814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov 2982c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) { 2983c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 29843c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 29850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 2986c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*service.get(), SetState(_)).Times(0); 2987c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 2988c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal ReportLinkUp(); 2989c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2990c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // Verify expectations now, because WiFi may cause |service| state 2991c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal // changes during TearDown(). 29920951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 2993c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 2994c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 2995c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) { 2996c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal StartWiFi(); 29973c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service( 29980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr)); 29998f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley Mock::VerifyAndClearExpectations(dhcp_config_.get()); 3000c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0); 30018f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Simulate a rekeying event from the AP. These show as transitions from 30028f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // completed->completed from wpa_supplicant. 30030654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 30045519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // When we get an IP, WiFi should enable high bitrates on the interface again. 30053c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30063c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30073c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 30088f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley ReportIPConfigComplete(); 30098f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley // Similarly, rekeying events after we have an IP don't trigger L3 30105519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // configuration. However, we treat all transitions to completed as potential 30115519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley // reassociations, so we will reenable high rates again here. 30123c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 30133c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true)); 30143c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 30150654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3016c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal} 3017c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal 3018b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) { 3019b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): Consider using a factory for WiFiEndpoints, so that 3020b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // we can test the interaction between WiFi and WiFiEndpoint. (Right 3021b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // now, we're testing across multiple layers.) 3022b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber()); 3023b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _)); 3024b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 3025b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc); 3026b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3027b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 3028b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) { 3029b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a 3030b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // factory for WiFiEndpoints. 3031b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Get the pointer before we transfer ownership. 3032b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get(); 3033b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal EXPECT_CALL(*proxy, Die()); 3034b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal StartWiFi(); 30353c5040174273386868cc8dea8044d22c465885d8Paul Stewart DBus::Path bss_path( 30360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr)); 30370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr)); 30383c5040174273386868cc8dea8044d22c465885d8Paul Stewart RemoveBSS(bss_path); 3039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // Check this now, to make sure RemoveBSS killed the proxy (rather 3040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal // than TearDown). 3041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal Mock::VerifyAndClearExpectations(proxy); 3042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal} 3043b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal 30445c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) { 30455c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval resume_time = {1, 0}; 30465c05b2920be742d518829972127172481722058dmukesh agrawal const struct timeval scan_done_time = {6, 0}; 30475c05b2920be742d518829972127172481722058dmukesh agrawal 30485c05b2920be742d518829972127172481722058dmukesh agrawal StartWiFi(); 30495c05b2920be742d518829972127172481722058dmukesh agrawal 30505c05b2920be742d518829972127172481722058dmukesh agrawal EXPECT_CALL(time_, GetTimeMonotonic(_)) 30515c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0))) 30525c05b2920be742d518829972127172481722058dmukesh agrawal .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0))); 30533c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 30545c05b2920be742d518829972127172481722058dmukesh agrawal FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5)); 30552f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal OnAfterResume(); 30565c05b2920be742d518829972127172481722058dmukesh agrawal ReportScanDone(); 30575c05b2920be742d518829972127172481722058dmukesh agrawal} 30585c05b2920be742d518829972127172481722058dmukesh agrawal 3059402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) { 3060402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan StartWiFi(); 3061402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30624b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto- 30634b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan // connectable services. 3064402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3065402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 3066402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30674b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)); 3068402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3069402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3070402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If we have 1 or more auto-connectable services, do not call 3071402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3072402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3073402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(1)); 3074402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_TRUE(wifi()->IsIdle()); 30754b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3077402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3078402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 3079402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // If the WiFi device is not Idle, do not call 3080402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan. 3081402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan SetCurrentService(MakeMockService(kSecurityWep)); 3082402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_FALSE(wifi()->IsIdle()); 3083402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices()) 3084402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .WillOnce(Return(0)); 30854b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _)) 3086402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan .Times(0); 3087402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan ReportScanDone(); 3088402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan} 3089402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan 30905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) { 30915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 3092b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3093b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3094b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3095b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3096b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3097b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 30987de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 30990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3100b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)); 3101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3102b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3103b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3104b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) { 31075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 31085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 31105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie CancelScanTimer(); 31115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_TRUE(GetScanTimer().IsCancelled()); 31120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); 3113df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 31145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 31155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie FireScanTimer(); 31165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 31185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 31195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3120b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) { 3121b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3122b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3123b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3124b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3125b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3126b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // Should not call Scan, since we're already scanning. 3127b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal // (Scanning is triggered by StartWiFi.) 3128b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3130b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3131b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3132b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3133b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) { 3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3137b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 31383c5040174273386868cc8dea8044d22c465885d8Paul Stewart MockWiFiServiceRefPtr service = 31390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr); 3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3141b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3143b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 3145b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal FireScanTimer(); 3146b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3147b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed. 3148b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3149b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) { 31512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EnableFullScan(); 31522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartWiFi(); 31532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan ReportScanDone(); 31552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan CancelScanTimer(); 31562d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); 31572d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 31582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 31592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true)); 31612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 31622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan FireScanTimer(); 31632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan dispatcher_.DispatchPendingEvents(); 31642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_TRUE(GetScanTimer().IsCancelled()); // Do not re-arm. 31652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 31662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3167b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) { 3168b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3169b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3170b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3171b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(1, nullptr); 3173b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3174b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3175b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3176b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) { 3177b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3178b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal CancelScanTimer(); 3179b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3180b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal ReportScanDone(); 3182b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3184b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3185b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) { 3186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_FALSE(GetScanTimer().IsCancelled()); 3188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetScanInterval(0, nullptr); 3190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_TRUE(GetScanTimer().IsCancelled()); 3191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3192b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 31935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) { 31945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EnableFullScan(); 31955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie StartWiFi(); 31965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 31970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 31985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie vector<uint8_t>kSSID(1, 'a'); 31995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ByteArrays ssids; 32005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ssids.push_back(kSSID); 3201a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie .WillRepeatedly(Return(ssids)); 32045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), 32055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie Scan(HasHiddenSSID_FullScan(kSSID))); 32065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 32075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie dispatcher_.DispatchPendingEvents(); 32085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie} 32095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie 3210b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) { 3211b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3212b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 32135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie ReportScanDone(); 32140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 3215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InstallMockScanSession(); 32163c5040174273386868cc8dea8044d22c465885d8Paul Stewart vector<uint8_t>kSSID(1, 'a'); 32173c5040174273386868cc8dea8044d22c465885d8Paul Stewart ByteArrays ssids; 32183c5040174273386868cc8dea8044d22c465885d8Paul Stewart ssids.push_back(kSSID); 3219a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 32203c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32213c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ssids)); 32225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()); 32230654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3224b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3225b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 3227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) { 3228b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal StartWiFi(); 3229b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 32300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 3231b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 3232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 32333c5040174273386868cc8dea8044d22c465885d8Paul Stewart EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()) 32343c5040174273386868cc8dea8044d22c465885d8Paul Stewart .WillRepeatedly(Return(ByteArrays())); 32350654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3236b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal dispatcher_.DispatchPendingEvents(); 3237b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal} 3238b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal 32393c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) { 32403c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart ScopedMockLog log; 32412ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal auto link_monitor = new StrictMock<MockLinkMonitor>(); 32422ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal StartWiFi(); 32433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart SetLinkMonitor(link_monitor); 32442ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 32453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(*link_monitor, IsGatewayFound()) 32463c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillOnce(Return(false)) 32473c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart .WillRepeatedly(Return(true)); 32482ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32492ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // We never had an ARP reply during this connection, so we assume 32502ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // the problem is gateway, rather than link. 32513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 32523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EndsWith("gateway was never found."))).Times(1); 3253daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32552ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32562ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // No supplicant, so we can't Reattach. 32582ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantVanish(); 32592ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 32602ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EndsWith("Cannot reassociate."))).Times(1); 32612ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0); 32622ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnLinkMonitorFailure(); 32632ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal 32652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal // Normal case: call Reattach. 32662ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal OnSupplicantAppear(); 32673c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart EXPECT_CALL(log, Log(logging::LOG_INFO, _, 3268daa14ee5563728284964c59771e36691595e4188Peter Qiu EndsWith("Called Reattach()."))).Times(1); 3269daa14ee5563728284964c59771e36691595e4188Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1); 32703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart OnLinkMonitorFailure(); 32713c5040174273386868cc8dea8044d22c465885d8Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart} 32733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart 32748e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) { 32758e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu StartWiFi(); 327670068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 32778e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 32788e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1); 32798e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu OnUnreliableLink(); 32808e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 32818e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu} 32828e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu 3283cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) { 3284f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 3285bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 32860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 3287cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3288cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3289bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) { 3290f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 32910654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3292bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3293bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)) 3294bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(true)); 32950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 32961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3297bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 32981369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureBadPassphrase, failure); 3299cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3300cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3301f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) { 3302f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart StartWiFi(); 3303f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart dispatcher_.DispatchPendingEvents(); 3304f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep); 3305a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 3306f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart InitiateConnect(service); 3307f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart SetCurrentService(service); 3308f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3309f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // These expectations are very much like SetupConnectedService except 3310f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // that we verify that ResetSupsectCredentialFailures() is not called 3311f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // on the service just because supplicant entered the Completed state. 3312f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, SetState(Service::kStateConfiguring)); 3313f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 3314b108318d9554032feee1249d51c961e4f90f4561Paul Stewart EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber()); 3315f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber()); 3316f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 3317f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3318f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3319f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 3320f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3321f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 33220951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3323f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3324f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Successful connect. 3325f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1); 3326f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()); 3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportConnected(); 3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*device_info(), GetByteCounts(_, _, _)) 3330f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true))) 3331f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))) 3332f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true))); 3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // If there was an increased byte-count while we were timing out DHCP, 3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // this should be considered a DHCP failure and not a credential failure. 3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0); 33370d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33390d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3340f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33410951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3342f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP but service does not (yet) believe this is 3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // due to a passphrase issue. 3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(false)); 33470d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, 33480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33490d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3350f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 33510951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3352f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // Connection failed during DHCP and service believes this is due to a 3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart // passphrase issue. 3355f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3356f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart .WillOnce(Return(true)); 3357f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart EXPECT_CALL(*service, 33580d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan DisconnectWithFailure(Service::kFailureBadPassphrase, 33590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 33600d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("OnIPConfigFailure"))); 3361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart ReportIPConfigFailure(); 3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart} 3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart 33641369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) { 3365f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3366735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3367735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3368735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)) 3369735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(false)) 3370735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3371bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33730951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3374bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3375bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 33761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart Service::ConnectFailure failure; 3377bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_TRUE(SuspectCredentials(service, &failure)); 33781369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_EQ(Service::kFailureEAPAuthentication, failure); 33790951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3380bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3381bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0); 33820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3384bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart 3385bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()) 3386bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart .WillOnce(Return(false)); 33870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_FALSE(SuspectCredentials(service, nullptr)); 33881369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 33891369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 33901369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) { 3391f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 3392cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal SetPendingService(service); 33930654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 3394cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 3395a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 3396bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3397f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase)); 33984943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3399735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3400cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3401f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase))); 34020654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 34031369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart} 34041369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 34051369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) { 3406f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 34071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart SetCurrentService(service); 34081369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart 3409735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ScopedMockLog log; 3410735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 34114943822214f823c2437aa32b0376414b3e60388dPeter Qiu EXPECT_CALL(*service, SetState(Service::kStateIdle)); 3412735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // Ensure that we retrieve is_eap_in_progress() before resetting the 3413735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart // EAP handler's state. 3414735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart InSequence seq; 3415735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, is_eap_in_progress()) 3416735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(Return(true)); 3417bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true)); 3418735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication)); 34191369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 342039a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan EndsWith(kErrorEapAuthenticationFailed))); 3421735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, Reset()); 34220654ece95920696c530ce1c0344365eb741f7efePaul Stewart ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 3423cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal} 3424cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal 34251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) { 34261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(*wake_on_wifi_, 34271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(IsConnectedToCurrentService())); 34281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan ReportConnectedToServiceAfterWake(); 34291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 34301964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 3431e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real 3432e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one. 34331aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest { 3434e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public: 34351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {} 3436e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3437e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected: 3438e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart void ExpectInitialScanSequence(); 3439e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3440e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StrictMock<MockEventDispatcher> mock_dispatcher_; 3441e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}; 3442e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34431aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() { 3444e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Choose a number of iterations some multiple higher than the fast scan 3445e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // count. 3446e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart const int kScanTimes = WiFi::kNumFastScanAttempts * 4; 3447e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3448e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // Each time we call FireScanTimer() below, WiFi will post a task to actually 3449e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // run Scan() on the wpa_supplicant proxy. 3450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)) 3451e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes); 3452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart { 3453e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart InSequence seq; 3454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // The scans immediately after the initial scan should happen at the short 3455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // interval. If we add the initial scan (not invoked in this function) to 3456e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at 3457e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // the fast scan interval. 3458e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(WiFi::kNumFastScanAttempts - 1) 3461e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // After this, the WiFi device should use the normal scan interval. 3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, GetScanInterval() * 1000)) 3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1) 3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillRepeatedly(Return(true)); 3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart for (int i = 0; i < kScanTimes; i++) { 3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart FireScanTimer(); 3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart } 3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34751aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) { 347666bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer. 347766bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 34780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // This PostTask is a result of the call to Scan(nullptr), and is meant to 3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // post a task to call Scan() on the wpa_supplicant proxy immediately. 3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)); 3481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart StartWiFi(); 3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3488e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart // If we end up disconnecting, the sequence should repeat. 3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart _, WiFi::kFastScanIntervalSeconds * 1000)) 3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart .WillOnce(Return(true)); 3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart RestartFastScanAttempts(); 3493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 3494e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart ExpectInitialScanSequence(); 3495e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart} 3496e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart 34971aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) { 34981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 34991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35003c5040174273386868cc8dea8044d22c465885d8Paul Stewart StartWiFi(); 35010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 35021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StopReconnectTimer(); 35091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart GetReconnectTimeoutCallback().callback().Run(); 35151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(1); 35181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart _, GetReconnectTimeoutSeconds() * 1000)).Times(0); 35231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart StartReconnectTimer(); 35241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart} 35251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart 35267cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) { 35277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 35287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 35297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Setup a connected service here while we have the expectations above set. 35317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart StartWiFi(); 35327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart MockWiFiServiceRefPtr service = 35330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 35347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart string connected_bss = GetSupplicantBSS(); 35357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35375412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0); 35387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 35397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NiceScopedMockLog log; 35407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // There is no current_service_. 35427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetCurrentService(nullptr); 35447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // current_service_ is not connected. 35477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false)); 35487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetCurrentService(service); 35497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected"))); 35507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Endpoint does not exist in endpoint_by_rpcid_. 35537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true)); 35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid"); 35557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(log, Log(_, _, HasSubstr( 35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart "Can't get endpoint for current supplicant BSS"))); 35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&netlink_manager_); 35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart Mock::VerifyAndClearExpectations(&mock_dispatcher_); 35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // We successfully trigger a request to get the station and start a timer 35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // for the next call. 35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(netlink_manager_, SendNl80211Message( 35645412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _)); 35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(mock_dispatcher_, PostDelayedTask( 35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart _, WiFi::kRequestStationInfoPeriodSeconds * 1000)); 35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart SetSupplicantBSS(connected_bss); 35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart RequestStationInfo(); 35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 35707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Now test that a properly formatted New Station message updates strength. 35717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NewStationMessage new_station; 35727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 35737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 3574baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Confirm that up until now no link statistics exist. 3575baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart KeyValueStore link_statistics = GetLinkStatistics(); 3576baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_TRUE(link_statistics.IsEmpty()); 3577baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // Use a reference to the endpoint instance in the WiFi device instead of 35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart // the copy returned by SetupConnectedService(). 35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second; 35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetRawAttributeValue( 35827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->CreateNestedAttribute( 35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, "Station Info"); 35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListRefPtr station_info; 35867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->GetNestedAttributeList( 35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart NL80211_ATTR_STA_INFO, &station_info); 35887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3589baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalValue = -20; 35907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3591baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage"); 3592baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int kSignalAvgValue = -40; 3593baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG, 3594baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kSignalAvgValue); 3595baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME, 3596baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "InactiveTime"); 3597baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kInactiveTime = 100; 3598baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME, 3599baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kInactiveTime); 3600baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS, 3601baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "ReceivedSuccesses"); 3602baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kReceiveSuccesses = 200; 3603baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS, 3604baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kReceiveSuccesses); 3605baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED, 3606baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitFailed"); 3607baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitFailed = 300; 3608baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED, 3609baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitFailed); 3610baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS, 3611baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitSuccesses"); 3612baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitSuccesses = 400; 3613baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS, 3614baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitSuccesses); 3615baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES, 3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "TransmitRetries"); 3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int32_t kTransmitRetries = 500; 3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES, 3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kTransmitRetries); 3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart "Bitrate Info"); 3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart // Embed transmit bitrate info within the station info element. 3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart AttributeListRefPtr bitrate_info; 3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->GetNestedAttributeList( 3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate"); 3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kBitrate = 6005; 3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate); 3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS"); 3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart const int16_t kMCS = 7; 3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS); 3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40"); 3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true); 3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 36397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO); 36407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 36417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_NE(kSignalValue, endpoint->signal_strength()); 36427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint))); 36438e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10)); 36447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart AttributeListConstRefPtr station_info_prime; 36457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart ReportReceivedStationInfo(new_station); 36467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart EXPECT_EQ(kSignalValue, endpoint->signal_strength()); 3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart 3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics = GetLinkStatistics(); 3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_FALSE(link_statistics.IsEmpty()); 3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty)); 3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalValue, 3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kLastReceiveSignalDbmProperty)); 3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty)); 3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kSignalAvgValue, 3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetInt(kAverageReceiveSignalDbmProperty)); 3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty)); 3657baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kInactiveTime, 3658baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kInactiveTimeMillisecondsProperty)); 3659baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty)); 3660baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kReceiveSuccesses, 3661baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketReceiveSuccessesProperty)); 3662baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty)); 3663baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitFailed, 3664baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitFailuresProperty)); 3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty)); 3666baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitSuccesses, 3667baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kPacketTransmitSuccessesProperty)); 3668baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty)); 3669baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(kTransmitRetries, 3670baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.GetUint(kTransmitRetriesProperty)); 3671baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz", 3672baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart kBitrate / 10, kBitrate % 10, kMCS), 3673baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart link_statistics.LookupString(kTransmitBitrateProperty, "")); 3674e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3675e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // New station info with VHT rate parameters. 3676e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NewStationMessage new_vht_station; 3677e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID"); 3678e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3679e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetRawAttributeValue( 3680e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex())); 3681e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->CreateNestedAttribute( 3682e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, "Station Info"); 3683e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->GetNestedAttributeList( 3684e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO, &station_info); 3685e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal"); 3686e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue); 3687e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE, 3688e50623a9e038964c729c17f850f140f62440e3afPeter Qiu "Bitrate Info"); 3689e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3690e50623a9e038964c729c17f850f140f62440e3afPeter Qiu // Embed transmit VHT bitrate info within the station info element. 3691e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->GetNestedAttributeList( 3692e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_STA_INFO_TX_BITRATE, &bitrate_info); 3693e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32"); 3694e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int32_t kVhtBitrate = 70000; 3695e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate); 3696e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS"); 3697e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtMCS = 7; 3698e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS); 3699e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS"); 3700e50623a9e038964c729c17f850f140f62440e3afPeter Qiu const int8_t kVhtNSS = 1; 3701e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS); 3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80"); 3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true); 3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI"); 3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false); 3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE); 3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3708e50623a9e038964c729c17f850f140f62440e3afPeter Qiu new_vht_station.attributes()->SetNestedAttributeHasAValue( 3709e50623a9e038964c729c17f850f140f62440e3afPeter Qiu NL80211_ATTR_STA_INFO); 3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 37118e43058d862502b49c769742f6d5e61e28286254Peter Qiu EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10)); 37128e43058d862502b49c769742f6d5e61e28286254Peter Qiu 3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu ReportReceivedStationInfo(new_vht_station); 3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu 3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics = GetLinkStatistics(); 3716e50623a9e038964c729c17f850f140f62440e3afPeter Qiu EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d", 3717e50623a9e038964c729c17f850f140f62440e3afPeter Qiu kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS), 3718e50623a9e038964c729c17f850f140f62440e3afPeter Qiu link_statistics.LookupString(kTransmitBitrateProperty, "")); 37197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart} 37207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart 37211964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) { 37221964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber()); 37231964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber()); 37241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan StartWiFi(); 37251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan SetupConnectedService(DBus::Path(), nullptr, nullptr); 37261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan EXPECT_CALL( 37271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan mock_dispatcher_, 37281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds)); 37291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan OnAfterResume(); 37301964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan} 37311964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan 37322d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) { 37332d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37342d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan // Return immediately if scan interval is 0. 37352d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(0, &e); 37362d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0); 37372d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37382d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) { 37412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37432d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37442d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(1); 37452d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, 37462d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000)); 37472d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37482d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37492d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 37502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) { 37512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan Error e; 37522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan const int scan_interval = 10; 37532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetScanInterval(scan_interval, &e); 37542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan SetFastScansRemaining(0); 37552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000)); 37562d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan StartScanTimer(); 37572d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan} 37582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan 3759bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) { 3760f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3761bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0); 3762bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3763bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ScopedMockLog log; 3764bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3765bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart map<string, ::DBus::Variant> args; 3766bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3767bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3768bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3769bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart SetCurrentService(service); 3770bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter."))); 3771bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3772bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3773bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 37747fab89734d88724a288e96a9996b15548c5294c7Ben Chan const uint32_t kDepth = 123; 37750654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth); 3776bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3777bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(log, 3778bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Log(logging::LOG_ERROR, _, EndsWith("no subject parameter."))); 3779bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3780bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart Mock::VerifyAndClearExpectations(&log); 3781bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3782bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart const string kSubject("subject"); 37830654ece95920696c530ce1c0344365eb741f7efePaul Stewart args[WPASupplicant::kInterfacePropertySubject].writer() 3784bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart .append_string(kSubject.c_str()); 3785bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1); 3786bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart ReportCertification(args); 3787db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart} 3788db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 37893cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) { 37903cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanFailedTask if scan failed. 37913cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 37923cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, 37933cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds)); 37943cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(false); 37953cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_FALSE(ScanFailedCallbackIsCancelled()); 37963cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 37973cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed 37983cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan // callback if has been dispatched. 37993cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_CALL(mock_dispatcher_, PostTask(_)); 38003cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan ScanDone(true); 38013cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan EXPECT_TRUE(ScanFailedCallbackIsCancelled()); 38023cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan} 38033cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan 3804db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) { 380511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StartWiFi(); 3806db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart ScopedMockLog log; 3807db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service."))); 3808735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0); 3809735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPStatus("eap-status"); 3810735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart const string kEAPParameter("eap-parameter"); 3811735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3812db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart Mock::VerifyAndClearExpectations(&log); 3813db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 3814db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3815f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x); 3816db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart EXPECT_CALL(*service, SetFailure(_)).Times(0); 3817735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)); 3818db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart SetCurrentService(service); 3819735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 38200951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko Mock::VerifyAndClearExpectations(service.get()); 3821735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Mock::VerifyAndClearExpectations(eap_state_handler_); 3822db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart 3823735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 3824735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange), 3825735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart Return(false))); 38260d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, 38270d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38280d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 3829735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 383011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 383111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart MockEapCredentials *eap = new MockEapCredentials(); 383211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart service->eap_.reset(eap); // Passes ownership. 383311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const char kNetworkRpcId[] = "/service/network/rpcid"; 383411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart SetServiceNetworkRpcId(service, kNetworkRpcId); 383511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 383611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 383711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 383811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 383911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kEmptyPin; 384011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin)); 38410d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, 38420d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan _, 38430d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan StrEq("EAPEventTask"))); 384411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 384511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart 384611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _)) 384711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing), 384811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Return(false))); 384911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart // We need a real string object since it will be returned by reference below. 385011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart const string kPin("000000"); 385111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin)); 38520d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0); 385311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 385411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart NetworkReply(StrEq(kNetworkRpcId), 385511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart StrEq(WPASupplicant::kEAPRequestedParameterPIN), 385611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart Ref(kPin))); 385711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart ReportEAPEvent(kEAPStatus, kEAPParameter); 3858bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart} 3859bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart 3860c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) { 3861c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Scan is one task that should be skipped after Stop. Others are 3862c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // skipped by the same mechanism (invalidating weak pointers), so we 3863c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // don't test them individually. 3864c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // 3865c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // Note that we can't test behavior by setting expectations on the 3866c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal // supplicant_interface_proxy_, since that is destroyed when we StopWiFi(). 3867c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StartWiFi(); 3868c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal StopWiFi(); 3869c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal dispatcher_.DispatchPendingEvents(); 3870c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal} 3871c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal 38726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS { 38736d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bsspath; 38746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string ssid; 38756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah string bssid; 38766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah int16_t signal_strength; 38777fab89734d88724a288e96a9996b15548c5294c7Ben Chan uint16_t frequency; 38786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah const char* mode; 38796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah}; 38806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) { 38826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah BSS bsses[] = { 38836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412, 38846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 38856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170, 38866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure}, 38876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah // Same SSID but different BSSID is an additional geolocation object. 38886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0, 38896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah kNetworkModeInfrastructure} 38906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah }; 38916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StartWiFi(); 38926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah vector<GeolocationInfo> objects; 38936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), 0); 38946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 38956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah for (size_t i = 0; i < arraysize(bsses); ++i) { 38966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid, 38976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode); 38986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah objects = wifi()->GetGeolocationObjects(); 38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_EQ(objects.size(), i + 1); 39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah GeolocationInfo expected_info; 39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid); 39036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoSignalStrengthProperty, 39046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah StringPrintf("%d", bsses[i].signal_strength)); 39056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah expected_info.AddField(kGeoChannelProperty, StringPrintf( 39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency))); 39076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah EXPECT_TRUE(objects[i].Equals(expected_info)); 39087347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie } 39097347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie} 39106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah 39115581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) { 39125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get(); 39135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // With WiFi not yet started, nothing interesting (including a crash) should 39155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // happen. 39165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 39175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // This unit test turns on WiFi debugging, so when we start WiFi, we should 39215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // check but not set the debug level if we return the "debug" level. 39225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39230654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 39245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StartWiFi(); 39265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39285581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is toggled and wpa_supplicant reports debugging 39295581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is set to some unmanaged level, WiFi should leave it alone. 39305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39310654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 39320654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelError)) 39330654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 39340654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelExcessive)) 39350654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 39360654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump)) 39370654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)) 39380654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelWarning)); 39395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned off and wpa_supplicant reports debugging 39515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned on, WiFi should turn supplicant debugging off. 39525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39530654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)); 39540654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo)) 39555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is turned on and wpa_supplicant reports debugging 39605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // is turned off, WiFi should turn supplicant debugging on. 39615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39620654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 39630654ece95920696c530ce1c0344365eb741f7efePaul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug)) 39645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart .Times(1); 39655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart Mock::VerifyAndClearExpectations(process_proxy); 39675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // If WiFi debugging is already in the correct state, it should not be 39695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // changed. 39705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()) 39710654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelDebug)) 39720654ece95920696c530ce1c0344365eb741f7efePaul Stewart .WillOnce(Return(WPASupplicant::kDebugLevelInfo)); 39735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 39775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart // After WiFi is stopped, we shouldn't be calling the proxy. 39785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0); 39795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0); 39805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart StopWiFi(); 39815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(true); 39825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart ReportWiFiDebugScopeChanged(false); 39835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart} 39845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart 398550cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) { 398650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=]", WiFi::LogSSID("")); 398750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar")); 398850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov} 398950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov 3990bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 3991bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 3992bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) { 3993bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanShortInterval 3994bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 3995bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 39967fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const uint16_t kKnownScanInterval = 4; 3997bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 3998bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error)); 3999bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4000bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4001bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error)); 4002bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4003bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4004bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4005bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetBgscanSignalThreshold 4006bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4007bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 40087fab89734d88724a288e96a9996b15548c5294c7Ben Chan static const int32_t kKnownSignalThreshold = 4; 4009bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to known value. 4010bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4011bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4012bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Set to same value. 4013bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error)); 4014bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4015bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4016bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 4017bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // SetScanInterval 4018bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal { 4019bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 4020bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error)); 4021bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 4022bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal } 4023bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 4024bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 40250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine. 40260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40270cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) { 40289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportScanDone(); 4030a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4031a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4032a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4033a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4034a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->"))); 40377de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 40380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 40390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40450cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) { 40469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodFull); 40470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 40480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 40499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull, 40509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &endpoint, 40519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie &bss_path); 40520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4056a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4057a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4058a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED"))); 40610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 40620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40680cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) { 40699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 40700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie WiFiEndpointRefPtr endpoint; 40710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ::DBus::Path bss_path; 40729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 40739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, &bss_path); 40740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie // Complete the connection. 4076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 40770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint))); 4078a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4079a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4080a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 40810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 40820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED"))); 40830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ReportCurrentBSSChanged(bss_path); 40840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 40850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 40860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 40870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 40880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie} 40890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie 4090df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) { 40919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4092df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 40939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie MockWiFiServiceRefPtr service = AttemptConnection( 40949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie WiFi::kScanMethodProgressive, &endpoint, nullptr); 4095df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4096df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Simulate connection timeout. 4097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*service, 4099a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0); 41009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4101df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4102df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4103df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4104df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, 4105df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION"))); 4106df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0); 4107df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie TimeoutPendingConnection(); 4108df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4109df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4110df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4111df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4112df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4113b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) { 4114b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4115b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie Times(0); 4116df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)); 4117b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__); 4118b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4119df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)); 4120df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__); 4122df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4125b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)); 4126b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__); 4127b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie} 4128b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie 4129df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) { 4130df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4131df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)); 4132df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__); 4133df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // After connected. 4135df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)); 4136df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4137df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4138df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__); 4139df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4140df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4141df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) { 41420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition a) 4143df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // |ConnectTo|->|DisconnectFrom|. 41449f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4145df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4146df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup pending service. 4147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_pending( 41500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 4151df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_pending.get(), GetPendingService().get()); 4152df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4153df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // ConnectTo a different service than the pending one. 4154a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4155a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()); 41569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie NiceScopedMockLog log; 4157df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4158df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4159df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4160df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))); 4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING"))); 4162df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service_connecting( 41630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectingService(DBus::Path(), nullptr, nullptr)); 4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4165df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4166df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_EQ(service_connecting.get(), GetPendingService().get()); 41670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan EXPECT_EQ(nullptr, GetCurrentService().get()); 4168df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4169a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4170a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); // To silence messages from the destructor. 4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4172df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4173df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) { 41749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4175df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4176a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)). 4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WillOnce(Throw( 4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie DBus::Error( 4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "fi.w1.wpa_supplicant1.InterfaceUnknown", 4181df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie "test threw fi.w1.wpa_supplicant1.InterfaceUnknown"))); 4182df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4183df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4184df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4185f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false)); 4186f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4187a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart EXPECT_CALL(*service, GetSupplicantConfigurationParameters()); 4188df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie InitiateConnect(service); 4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_TRUE(IsScanSessionNull()); 4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4192df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) { 41940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // Test for SetPendingService(nullptr), condition d) Disconnect while 41950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan // scanning. 41960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan 4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Start scanning. 41989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Set the pending service. 4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDoneKeepScanSession(); 4202a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4203a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4204f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone); 4205df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetPendingService(service); 4206df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive); 4207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Disconnect from the pending service. 4209a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanIdle(); 4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0); 4211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)). 4212df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4213df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull); 4214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) { 4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Setup WiFi but terminate scan. 4219f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)). 4220a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie Times(AnyNumber()); 4221a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 42222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStart(WiFi::kScanMethodProgressive, false); 4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie StartWiFi(); 4224a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie dispatcher_.DispatchPendingEvents(); 4225a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie 4226a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectScanStop(); 4227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectFoundNothing(); 4228df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportScanDone(); 4229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie dispatcher_.DispatchPendingEvents(); 4230a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connecting. 4233a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnecting(); 4234df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0); 4235df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie WiFiEndpointRefPtr endpoint; 4236df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ::DBus::Path bss_path; 4237a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie NiceScopedMockLog log; 4238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 4239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(10); 4240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))). 4242df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie Times(0); 4243df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)"))); 4244df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie MockWiFiServiceRefPtr service = 4245df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie SetupConnectingService(DBus::Path(), &endpoint, &bss_path); 4246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie // Connected. 4248a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie ExpectConnected(); 4249df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related"))); 4250df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ReportCurrentBSSChanged(bss_path); 4251df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->set_verbose_level(0); 4252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 4254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie} 4255df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie 42563bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) { 42573bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart StartWiFi(); 42580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan SetupConnectedService(DBus::Path(), nullptr, nullptr); 42593bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42603bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42613bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1); 42622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 42633bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); 42643bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull); 42653bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42663bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart ReportScanDone(); 42677de7e02e14074989757a4f9f220de2310cc05236Paul Stewart EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)); 42683bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart dispatcher_.DispatchPendingEvents(); // Launch UpdateScanStateAfterScanDone 42693bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone); 42703bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart} 42713bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart 42722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) { 42732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodFull); 42742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a progressive scan. 42762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 42772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 42782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodProgressive); 42792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 42802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull); 42812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 42832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 42842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 42852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 42862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) { 42882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie StartScan(WiFi::kScanMethodProgressive); 42892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // Now, try to slam-in a full scan. 42912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*scan_session_, InitiateScan()).Times(0); 42922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0); 42932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie TriggerScan(WiFi::kScanMethodFull); 42942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie dispatcher_.DispatchPendingEvents(); 42952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive); 42962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 42972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie // And, for the destructor. 42982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanStop(); 42992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie ExpectScanIdle(); 43002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie} 43012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie 4302c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) { 4303df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart StartWiFi(); 4304df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kPeer[] = "peer"; 4305df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4306df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 4307df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4308df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4309df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4310df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4311df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4312df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSDiscover(kPeer)); 4313df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSDiscover(kPeer)); 4314df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4315df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4316df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 4317df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4318df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4319df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4320df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4321df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4322df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSSetup(kPeer)); 4323df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSSetup(kPeer)); 4324df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4325df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4326df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart const char kStatus[] = "peachy keen"; 4327df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4328df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return(kStatus)) 4329df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4330df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4331df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4332df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4333df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ(kStatus, TDLSStatus(kPeer)); 4334df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_EQ("", TDLSStatus(kPeer)); 4335df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4336df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4337df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4338df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Return()) 4339df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart .WillOnce(Throw( 4340df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart DBus::Error( 4341df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4342df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4343df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_TRUE(TDLSTeardown(kPeer)); 4344df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart EXPECT_FALSE(TDLSTeardown(kPeer)); 4345df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4346df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart} 4347df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart 4348c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) { 4349c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart StartWiFi(); 4350c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kPeer[] = "00:11:22:33:44:55"; 4351c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4352c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4353c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4354c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error)); 4355c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4356c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4357c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4358c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4359c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4360c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error)); 4361c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // This is not a valid IP address nor is it a MAC address. 4362c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4363c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4364c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4365c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kAddress[] = "192.168.1.1"; 4366c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info())); 4367c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4368c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4369c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // The provided IP address is not local. 4370c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 4371c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(false)); 4372c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4373c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 4374c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 4375c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ(Error::kInvalidArguments, error.type()); 4376c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 4377c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4378c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4379c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart { 4380c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // If the MAC address of the peer is in the ARP cache, we should 4381c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart // perform the TDLS operation on the resolved MAC. 4382c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const char kResolvedMac[] = "00:11:22:33:44:55"; 4383c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart const ByteString kMacBytes( 4384c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac)); 4385c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _)) 4386c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(Return(true)); 4387c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _)) 4388c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true))); 4389c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), 4390c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart TDLSDiscover(StrEq(kResolvedMac))); 4391c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Error error; 4392c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, 4393c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart kAddress, &error)); 4394c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4395c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(device_info()); 4396c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4397c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart } 4398c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart 4399c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // This is the same test as TDLSInterfaceFunctions above, but using the 4400c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart // method called by the RPC adapter. 4401c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer))) 4402c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4403c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4404c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4405c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4406c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4407c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4408c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4409c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 4410c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4411c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4412c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4413c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4414c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error)); 4415c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4416c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4417c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4418c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4419c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer))) 4420c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4421c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4422c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4423c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4424c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4425c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4426c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4427c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 4428c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4429c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4430c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4431c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4432c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error)); 4433c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4434c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4435c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4436c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4437c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4438c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart const map<string, string> kTDLSStatusMap { 4439c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { "Baby, I don't care", kTDLSUnknownState }, 4440c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState }, 4441c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState }, 4442c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState }, 4443c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState }, 4444c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart }; 4445c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4446c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart for (const auto &it : kTDLSStatusMap) { 4447c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4448c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return(it.first)); 4449c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4450c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(it.second, 4451c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4452c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4453c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4454c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4455c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4456c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer))) 4457c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4458c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4459c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4460c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4461c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4462c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4463c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error)); 4464c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4465c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4466c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy()); 4467c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 4468c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer))) 4469c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Return()) 4470c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart .WillOnce(Throw( 4471c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart DBus::Error( 4472c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "fi.w1.wpa_supplicant1.UnknownError", 4473c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart "test threw fi.w1.wpa_supplicant1.UnknownError"))); 4474c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4475c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4476c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4477c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_TRUE(error.IsSuccess()); 4478c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4479c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart { 4480c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart Error error; 4481c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error)); 4482c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart EXPECT_EQ(Error::kOperationFailed, error.type()); 4483c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart } 4484c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart} 4485c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart 44863946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) { 4487235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage new_wiphy_message; 4488235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan new_wiphy_message.InitFromNlmsg( 4489235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg), 4490235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 44913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), Start(_)); 4492235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_)); 4493235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex)); 4494235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->clear(); 44953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal OnNewWiphy(new_wiphy_message); 4496235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies), 4497235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->size()); 4498235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) { 4499235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(GetAllScanFrequencies()->find(freq) != 4500235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan GetAllScanFrequencies()->end()); 4501235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan } 45023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 45033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 45043946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) { 45053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2); 45063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateCompleted); 45073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake); 45083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 45093946da840142cd386d628c0e879459f8976bd86dmukesh agrawal EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false)); 45103946da840142cd386d628c0e879459f8976bd86dmukesh agrawal ReportStateChanged(WPASupplicant::kInterfaceStateAssociating); 45113946da840142cd386d628c0e879459f8976bd86dmukesh agrawal} 45123946da840142cd386d628c0e879459f8976bd86dmukesh agrawal 45133c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) { 4514787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopedMockLog log; 4515787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4516787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45174bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 4518787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained"))); 4519787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4520787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info())); 4521787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPConfigComplete(); 4522787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4523787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained"))); 4524787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)); 4525787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ReportIPv6ConfigComplete(); 4526787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 45273c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was 45283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan // triggered by a gateway ARP. 45293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received"))); 45303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0); 45313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan ReportIPConfigCompleteGatewayArpReceived(); 45323c3c36a37a885d0a2e180998587af8390744f757Samuel Tan 4533787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 4534787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4535787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4536787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4537787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) { 4538c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan EXPECT_CALL( 4539c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan *wake_on_wifi_, 4540d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _)); 4541787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnBeforeSuspend(); 4542787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4543787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4544787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) { 4545787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan EXPECT_CALL(*wake_on_wifi_, 4546d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _)); 4547787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan OnDarkResume(); 45483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) { 45513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan StartWiFi(); 45523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x); 45533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x); 45543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId1[] = "/service/network/rpcid1"; 45553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const char kNetworkRpcId2[] = "/service/network/rpcid2"; 45563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path1(kNetworkRpcId1); 45573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ::DBus::Path path2(kNetworkRpcId2); 45583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service1, kNetworkRpcId1); 45593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetServiceNetworkRpcId(service2, kNetworkRpcId2); 45603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_FALSE(RpcIdByServiceIsEmpty()); 45613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1)); 45623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2)); 45633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan RemoveSupplicantNetworks(); 45643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(RpcIdByServiceIsEmpty()); 45653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) { 45685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 45695d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Device::ScanType scan_type = Device::kFullScan; 45705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 45715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]"))); 45735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 45745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 45755d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan scan_type = Device::kProgressiveScan; 45765d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 45775d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]"))); 45785d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 45795d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan} 45805d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan 45813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) { 45823fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan const Device::ScanType scan_type = Device::kFullScan; 45833fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 45843fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 45853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(1); 45863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 45873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SetPendingService(service); 45883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 45893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 45903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL( 45913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan log, 45923fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 45935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScan(scan_type); 45943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 45953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 45963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 45973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 45985d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) { 45995d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 46004b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan StartWiFi(); 46015d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 46023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ASSERT_TRUE(wifi()->IsIdle()); 46035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 46045d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 46055d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 46065d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)); 46075d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0)); 46085d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 46095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_TRUE(manager()->suppress_autoconnect()); 46103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 46113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 46125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) { 46135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 46143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan ScopedMockLog log; 46155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa); 46165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SetPendingService(service); 46175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan manager()->set_suppress_autoconnect(false); 46185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(wifi()->IsIdle()); 46193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 46205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL( 46215d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan log, 46225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan Log(_, _, HasSubstr("skipping scan, already connecting or connected."))); 46235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(netlink_manager_, 46245d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 46255d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerScanMessage::kCommand), 46265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan _, _, _)).Times(0); 46275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0); 46285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan InitiateScanInDarkResume(freqs); 46295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_FALSE(manager()->suppress_autoconnect()); 46303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan} 46313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan 46325d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) { 4633381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan ScopedMockLog log; 46345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 46355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 46365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs; 4637381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan EXPECT_CALL(netlink_manager_, 4638381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 4639381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan TriggerScanMessage::kCommand), 4640381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan _, _, _)); 46415d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 46425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 46435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(0); 46445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 46455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 46465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4647381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan} 4648381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan 46495d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) { 46505d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopedMockLog log; 46515d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("wifi"); 46525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(3); 46535d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan const WiFi::FreqSet freqs = {1}; 46543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan EXPECT_CALL(netlink_manager_, 46553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan SendNl80211Message(IsNl80211Command(kNl80211FamilyId, 46563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan TriggerScanMessage::kCommand), 46573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan _, _, _)); 46585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 46595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels"))) 46605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan .Times(1); 46615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan TriggerPassiveScan(freqs); 46625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->EnableScopesByName("-wifi"); 46635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan ScopeLogger::GetInstance()->set_verbose_level(0); 4664787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan} 4665787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan 4666050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) { 4667050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // This test essentially performs ReportBSS(), but ensures that the 4668050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart // WiFi object successfully dispatches events in order. 4669050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart StartWiFi(); 4670050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4671050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss0", 4672050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0, 4673050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4674050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4675050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss1", 4676050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0, 4677050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4678050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSRemoved("bss0"); 4679050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart BSSAdded( 4680050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart "bss2", 4681050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0, 4682050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart kNetworkModeInfrastructure)); 4683050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4684050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00"); 4685050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01"); 4686050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02"); 4687050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4688050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart InSequence seq; 4689050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))); 4690050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))); 4691050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart WiFiServiceRefPtr null_service; 4692050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0))) 4693050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart .WillOnce(Return(null_service)); 4694050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))); 4695050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart dispatcher_.DispatchPendingEvents(); 4696050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart Mock::VerifyAndClearExpectations(wifi_provider()); 4697050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4698050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap(); 4699050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart EXPECT_EQ(2, endpoints_by_rpcid.size()); 4700050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart} 4701050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart 4702235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) { 4703235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag 4704235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // for having the wiphy index is set by ParseWiphyIndex. 4705235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex); 4706235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4707235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg), 4708235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 4709235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_TRUE(ParseWiphyIndex(msg)); 4710235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex); 4711235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4712235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4713235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) { 4714235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan ScopedMockLog log; 4715235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ 4716235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // U32 attribute, so that this message no longer contains a wiphy_index to be 4717235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan // parsed. 4718235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NewWiphyMessage msg; 4719235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan uint8_t message_memory[sizeof(kNewWiphyNlMsg)]; 4720235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan memcpy(message_memory, kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg)); 4721235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan struct nlattr *nl80211_attr_wiphy = reinterpret_cast<struct nlattr *>( 4722235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan &message_memory[kNewWiphyNlMsg_Nl80211AttrWiphyOffset]); 4723235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ; 4724235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(message_memory), 4725235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan NetlinkMessage::MessageContext()); 4726235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4727235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(log, Log(logging::LOG_ERROR, _, 4728235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY")); 4729235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_FALSE(ParseWiphyIndex(msg)); 4730235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0); 4731235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan} 4732235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan 4733d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) { 4734d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4735d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4736d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kActiveScanTriggerNlMsg), 4737d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan NetlinkMessage::MessageContext()); 4738d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true)); 4739d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4740d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4741d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4742d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) { 4743d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan SetWiphyIndex(kScanTriggerMsgWiphyIndex); 4744d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan TriggerScanMessage msg; 4745d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan msg.InitFromNlmsg( 4746d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan reinterpret_cast<const nlmsghdr *>(kPassiveScanTriggerNlMsg), 4747d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan NetlinkMessage::MessageContext()); 4748d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false)); 4749d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan OnScanStarted(msg); 4750d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan} 4751d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan 4752853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone} // namespace shill 4753