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 &parameter) {
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(), &params);
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(), &params);
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(), &params);
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(), &params);
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