wifi_unittest.cc revision 77994d69bae79ce07d3830c4f83144503a06b224
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be
3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file.
4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
5d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi.h"
6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h>
85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h>  // Needs typedefs from sys/socket.h.
95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h>
10ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include <netlink/attr.h>
115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h>
12f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h>
19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
26675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_config.h"
27675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_provider.h"
28125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h"
2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
31397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h"
327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
36084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h"
37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
3911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
40e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
41687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h"
423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
43cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
442ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
453426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
4610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
47af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h"
48a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
4902e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h"
508d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h"
5102e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h"
528d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h"
538d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h"
5402e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h"
5502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h"
5602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h"
57dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
59da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h"
60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h"
61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h"
62da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h"
63da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h"
64da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h"
6585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
66af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
67d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h"
68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h"
69618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu#include "shill/wifi/mock_tdls_manager.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
484fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// TODO(zqiu): update this test after dbus-c++ dependencies is removed from
485fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// PropertyStoreTest.
4866bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
487a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
488a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
4896bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
490de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
491f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanSignalThresholdProperty,
492a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
493a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
494a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
495a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
496a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
4976bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
498f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kScanIntervalProperty,
4996bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
5006bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
501a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
502853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
503a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
504a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
5056bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
506f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                          kScanningProperty,
5076bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
5086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
509bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
5109d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
511a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
512853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
5134d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
5144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
5156bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
5164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
517f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
5184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
5190654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
5204d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
5234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
5244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
5256bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
5264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
527f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
5284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
5294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
5324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
533fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// TODO(zqiu): update this test after dbus-c++ dependencies is removed from
534fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu// PropertyStoreTest.
5354a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
5360654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
5378abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
5384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
5404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
541e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
542e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
543f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
5468abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5478abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
5486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
5498abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
550f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty,
551f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn),
5528abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
5530654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
554e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
555f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5560654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
5578abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5588abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
559f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      device_->mutable_store(), kBgscanMethodProperty, &error));
560e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
561f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5648abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
5658abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5663c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
574e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
5753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
57677994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // Note: When this constructor is called (via the initialization lists in the
57777994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // constructors of WiFiMainTest and WiFiTimerTest), |dispatcher| will point to
57877994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // an uninitialized EventDispatcher. Any functions (including constructors in
57977994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // the initialization list) that use the message loop should not be called in
58077994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // this constructor, since the delayed initialization of the message loop can
58177994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // cause concurrency-related bugs. (See crbug.com/509138 for an example.)
5822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  explicit WiFiObjectTest(EventDispatcher* dispatcher)
583e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
5840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        metrics_(nullptr),
5850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        manager_(&control_interface_, nullptr, &metrics_, &glib_),
586e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
587fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_,
588fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan                       kDeviceName, kDeviceAddress, kInterfaceIndex)),
5893c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
590fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        mac80211_monitor_(new StrictMock<MockMac80211Monitor>(
591fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold,
592fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            base::Closure(), &metrics_)),
593084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_service_proxy_(new MockDBusServiceProxy()),
594dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
595af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()),
596af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)),
597084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_manager_(new DBusManager()),
5980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
599735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
6003c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
601fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu            new NiceMock<MockSupplicantInterfaceProxy>()),
602fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        supplicant_network_proxy_(new NiceMock<MockSupplicantNetworkProxy>()) {
6033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->mac80211_monitor_.reset(mac80211_monitor_);
6045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
605fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_process_proxy_.get(), CreateInterface(_, _))
606fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
607fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
608fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_process_proxy_.get(), GetInterface(_, _))
609fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
610fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
611fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), AddNetwork(_, _))
612fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
613fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
614fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), Disconnect())
615fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
616fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), RemoveNetwork(_))
617fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
618fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), Scan(_))
619fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
620fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_network_proxy_.get(), SetEnabled(_))
621fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
622c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
6233946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_))
6243946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        .Times(AnyNumber());
6253946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
6268e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    ON_CALL(dhcp_provider_, CreateIPv4Config(_, _, _, _))
627af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(Return(dhcp_config_));
628af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true));
6292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false));
630af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan
631af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateDBusServiceProxy())
632af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_));
633af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _))
634af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_));
635af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _))
636af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_));
637af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _))
638af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_));
639af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _))
640fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(ReturnAndReleasePointee(&supplicant_network_proxy_));
641318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
642ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
643735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
644735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
645735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
6462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
6473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
6485c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
649bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
6505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
6510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
6525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
6545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
6555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
6565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
6575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
6583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6595c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6605c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
6613ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
6623ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
663d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
664084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->proxy_factory_ = &proxy_factory_;
665ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
6662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    static_cast<Device*>(wifi_.get())->rtnl_handler_ = &rtnl_handler_;
6675c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
6683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
6692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
670b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
67177994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // Must be called here instead of in the constructor so that the destructor
67277994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // of SimpleAlarmTimer will not be invoked before the EventDispatcher is
67377994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // properly constructed (crbug.com/509138).
67477994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    InstallMockWakeOnWiFi();
6755c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
6765c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6775c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
6783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
6790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        .WillRepeatedly(Return(nullptr));
6800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SelectService(nullptr);
681b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
682b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
683b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
6843946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
6850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->proxy_factory_ = nullptr;
6863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
6883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
6890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->Stop(nullptr, ResultCallback());
6900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->set_dhcp_provider(nullptr);
691084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Stop();
6920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    dbus_manager_->proxy_factory_ = nullptr;
6933ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
6943ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
695d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
696f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
697f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
698549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
699549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
7003946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
7010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(false);  // Stop(nullptr, ResultCallback());
702549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
703549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
70417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
7050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    SetPendingService(nullptr);
70617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
707c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
7145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
7155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
7185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
7195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
7205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
7215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
7245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
7285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
7295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    set<uint16_t> available_frequencies;
7305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
7315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
7325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
7335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
7345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
7355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
7365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
7385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
740f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
7410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                        nullptr);
7425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
7435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
745fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  void InstallMockWakeOnWiFi() {
746fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_,
7471897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan                                       &metrics_);
748fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wifi_->wake_on_wifi_.reset(wake_on_wifi_);
749fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  }
750fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan
7515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
7525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
7535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
7545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnTriggerScanResponse(const Nl80211Message& message) {
7575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
7585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
760b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
761b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
7622b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                    const char* reason) {
763b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
764b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
765b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
7669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
7670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
7680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
7690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
7700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
7717fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void SetRoamThresholdMember(uint16_t threshold) {
772227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    wifi_->roam_threshold_db_ = threshold;
773227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
774227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7757fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetRoamThreshold(uint16_t threshold) {
776227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->SetRoamThreshold(threshold, nullptr);
777227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
778227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7797fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t GetRoamThreshold() const {
780227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->GetRoamThreshold(nullptr);
781227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
782227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
7847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
7857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
7862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Simulate the course of events when the last endpoint of a service is
7873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
789bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
7902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr& service)
791bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
792bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
793bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
794bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
7952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart        const WiFiEndpointConstRefPtr& endpoint) {
796bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
797bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
798bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
7993c5040174273386868cc8dea8044d22c465885d8Paul Stewart
8003c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
8033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart
8052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  EndpointRemovalHandler* MakeEndpointRemovalHandler(
8062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiServiceRefPtr& service) {
8073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
809b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
8123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
8133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
8162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char* mode,
8173c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
8182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* ssid,
8192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* path,
8202b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* bssid) {
8213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
823a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      *ssid = StringPrintf("ssid%d", bss_counter_);
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
825a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *path = StringPrintf("/interface/bss%d", bss_counter_);
826a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_);
8273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
8283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
8293c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
8303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
8313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8322b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string& ssid, const string& bssid) {
8333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
8362b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const string& ssid, const string& bssid, const string& mode) {
8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
8380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0);
8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
8412b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      vector<uint8_t> ssid, const std::string& security) {
8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
8433c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
849f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kModeManaged,
8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string& security) {
8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
856fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string MakeNewEndpointAndService(int16_t signal_strength,
857fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   uint16_t frequency,
858fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   const char* mode,
859fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   WiFiEndpointRefPtr* endpoint_ptr,
860fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   MockWiFiServiceRefPtr* service_ptr) {
8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
862fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string path;
8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
8673c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
8713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8723c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
8743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
880fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string AddEndpointToService(
8813c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
8823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
8837fab89734d88724a288e96a9996b15548c5294c7Ben Chan      uint16_t frequency,
8842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const char* mode,
8852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr) {
8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
887fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string path;
8883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8903c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
8913c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8923c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8943c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8953c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8963c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
9000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->ConnectTo(service.get());
9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
9030951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFrom(service.get());
9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  void InitiateDisconnectIfActive(WiFiServiceRefPtr service) {
9060951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFromIfActive(service.get());
907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  }
9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
909fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      const string& network_path,
9102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr,
911fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      string* bss_path_ptr) {
9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
9133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
914fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string bss_path(MakeNewEndpointAndService(
9153c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
916a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    if (!network_path.empty()) {
917a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
918fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _))
919fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          .WillOnce(DoAll(SetArgumentPointee<1>(network_path), Return(true)));
9208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(),
9218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu                  SetHT40Enable(network_path, true));
922a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
923a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
9253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
9260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
9283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9293c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9323c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9363c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
938fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      const string& network_path,
9392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr,
940fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      string* bss_path_ptr) {
9413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
942fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string bss_path;
9433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
9443c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
9453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9493c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
9523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
9533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
9540951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9553c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
957bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
9588e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
9598e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu        .Times(AnyNumber());
9603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
961a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
9620654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
9630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9643c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
9663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
968d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
969b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
970b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
971b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
9722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
9732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
9740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kFullScan, nullptr, __func__);
9752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
9760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kProgressiveScan, nullptr, __func__);
9772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
978c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
9792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFiServiceRefPtr& GetCurrentService() {
9801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
9811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
9822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr& service) {
983bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
984bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
9852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& GetEndpointMap() {
986165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
9873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9882b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFiServiceRefPtr& GetPendingService() {
9891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
9901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
9912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetPendingTimeout() {
9922b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
9932b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
9942b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetReconnectTimeoutCallback() {
995446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
996446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
9972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const ServiceRefPtr& GetSelectedService() {
9982ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal    return wifi_->selected_service();
9992ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  }
10002b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const string& GetSupplicantBSS() {
10017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
10027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
10032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetSupplicantBSS(const string& bss) {
10047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
10057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
10061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
10071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
10081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
10092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetScanTimer() {
1010b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
1011b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
10123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
1013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
10152b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  SupplicantProcessProxyInterface* GetSupplicantProcessProxy() {
10163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
10173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxyFromWiFi() {
10192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    return dynamic_cast<MockSupplicantInterfaceProxy*>(
10208a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
10233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
10243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
10253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
10262b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxy() {
10272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    MockSupplicantInterfaceProxy* proxy = GetSupplicantInterfaceProxyFromWiFi();
10283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
10293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
10302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const string& GetSupplicantState() {
10317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
10327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
10331caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int GetSupplicantDisconnectReason() {
10341caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein    return wifi_->supplicant_disconnect_reason_;
10351caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  }
10362b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ClearCachedCredentials(const WiFiService* service) {
1037835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
1038835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
10392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr& endpoint) {
10400427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
10410427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
1042fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bool RemoveNetwork(const string& network) {
1043381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
1044381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
1045fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore CreateBSSProperties(const string& ssid,
1046fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    const string& bssid,
1047fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    int16_t signal_strength,
1048fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    uint16_t frequency,
1049fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    const char* mode);
1050fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void RemoveBSS(const string& bss_path);
1051fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void ReportBSS(const string& bss_path,
10522b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const string& ssid,
10532b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const string& bssid,
10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
10557fab89734d88724a288e96a9996b15548c5294c7Ben Chan                 uint16_t frequency,
10562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const char* mode);
1057c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
10583c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, true);
10593c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  }
10603c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  void ReportIPConfigCompleteGatewayArpReceived() {
10613c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, false);
1062c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
1063050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1064050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // Calls the delayed version of the BSS methods.
1065fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void BSSAdded(const string& bss_path,
1066fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                const KeyValueStore& properties) {
1067050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSAdded(bss_path, properties);
1068050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1069fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void BSSRemoved(const string& bss_path) {
1070050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSRemoved(bss_path);
1071050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1072050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1073787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void ReportIPv6ConfigComplete() {
1074787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnIPv6ConfigUpdated();
1075787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1076f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
1077f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
1078f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1079f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
1080f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
1081f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1082f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
1083f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
1084f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
10852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ScanDone(const bool& success) {
10863cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanDone(success);
10873cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10883cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  void ReportScanFailed() {
10893cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanFailedTask();
10903cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
10925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
10935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
10945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
10955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
10965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
10975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
10985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
1099dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
11003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
11012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportCurrentBSSChanged(const string& new_bss) {
11021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
11031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
11042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportStateChanged(const string& new_state) {
11057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
11067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
11071caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  void ReportDisconnectReasonChanged(int reason) {
11081caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein    wifi_->DisconnectReasonChanged(reason);
11091caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  }
11105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
11115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
11125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
11137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
11147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
11157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
11162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message& nl80211_message) {
11177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
11187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
1119baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
11200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetLinkStatistics(nullptr);
1121baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
11222b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetPendingService(const WiFiServiceRefPtr& service) {
1123df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
1124cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
112511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
11262b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiServiceRefPtr& service, const string& rpcid) {
112711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
112811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
11293fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  bool RpcIdByServiceIsEmpty() {
11303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    return wifi_->rpcid_by_service_.empty();
11313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11322b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetScanInterval(uint16_t interval_seconds, Error* error) {
1133bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
1134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
1135e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
11360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetScanInterval(nullptr);
1137e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
11382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
1139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
1142a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1143a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1144a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
1145a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
1148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1149a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1150a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
1151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
11525412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _));
1153a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1154125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    StringCallback supplicant_name_owner_callback;
1155125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
1156125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      EXPECT_CALL(*dbus_service_proxy_.get(),
1157125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                  GetNameOwner(WPASupplicant::kDBusAddr, _, _, _))
1158125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu          .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated),
1159125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                          SaveArg<2>(&supplicant_name_owner_callback)));
1160125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu
1161084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Start();
11622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
11630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(true);  // Start(nullptr, ResultCallback());
1164125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
11650951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko      // Mimic the callback from |dbus_service_proxy_->GetNameOwner|.
1166125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error());
11673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
11682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
11692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
11702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11712f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
1172787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    EXPECT_CALL(*wake_on_wifi_, OnAfterResume());
11732f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
11742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
11752f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
1176fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    ResultCallback callback(
1177fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1178fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->OnBeforeSuspend(callback);
11792f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
1180787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void OnDarkResume() {
1181787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    ResultCallback callback(
1182787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1183787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnDarkResume(callback);
1184787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
11853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  void RemoveSupplicantNetworks() {
11863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    wifi_->RemoveSupplicantNetworks();
11873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11885d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  void InitiateScan(Device::ScanType scan_type) {
11895d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScan(scan_type);
11903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void InitiateScanInDarkResume(const WiFi::FreqSet& freqs) {
11925d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScanInDarkResume(freqs);
1193381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  }
11942b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void TriggerPassiveScan(const WiFi::FreqSet& freqs) {
11955d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->TriggerPassiveScan(freqs);
11963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
1198084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
11992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
12002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
12012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
1202084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
12032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
12042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
12052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
12062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
12072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
1208687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
1209687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
1210687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
12112b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetIPConfig(const IPConfigRefPtr& ipconfig) {
1212687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
1213687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
12142b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanMethod(const string& method) {
1215fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    Error error;
1216fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    return wifi_->mutable_store()->SetAnyProperty(kBgscanMethodProperty,
1217fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                                  chromeos::Any(method),
1218fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                                  &error);
12194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
12204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
12212b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void AppendBgscan(WiFiService* service,
1222fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    KeyValueStore* service_params) {
12234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
12244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
12254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1226fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void ReportCertification(const KeyValueStore& properties) {
1227bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
1228bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
122910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
12302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportEAPEvent(const string& status, const string& parameter) {
1231db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
1232db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
1233db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
1234e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
1235e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
1236e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
1237e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
12382d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void SetFastScansRemaining(int num) {
12392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->fast_scans_remaining_ = num;
12402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
12412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
12421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
12431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
12441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
12471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
12481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetLinkMonitor(LinkMonitor* link_monitor) {
12513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
12523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
12542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr& service,
12552b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                          Service::ConnectFailure* failure) {
12561369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
12571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
12581369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
12593c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
12603c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
12613c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
12638e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  void OnUnreliableLink() {
12648e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu    wifi_->OnUnreliableLink();
12658e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  }
12668e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
12672b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanShortInterval(const uint16_t& interval, Error* error) {
1268bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
1269bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1270bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanSignalThreshold(const int32_t& threshold, Error* error) {
1272bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
1273bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1274bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12752b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetTDLSManager(TDLSManager* tdls_manager) {
1276618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu    wifi_->tdls_manager_.reset(tdls_manager);
1277df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1278df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
12792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void TDLSDiscoverResponse(const string& peer_address) {
1280618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu    wifi_->TDLSDiscoverResponse(peer_address);
1281df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1282df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1283618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  string PerformTDLSOperation(
12842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const string& operation, const string& peer, Error* error) {
1285c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
1286c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
1287c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
1288df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
1289df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
1290df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
1291df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
12922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnNewWiphy(const Nl80211Message& new_wiphy_message) {
12933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
12943946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
12953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
1296787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  bool IsConnectedToCurrentService() {
1297787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    return wifi_->IsConnectedToCurrentService();
1298787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1299787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
13002b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  NiceMockControl* control_interface() {
130110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
130210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
130310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
13042b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMetrics* metrics() {
130585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
130685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
130785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
13082b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockManager* manager() {
13093239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
13103239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
1311d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
13122b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockDeviceInfo* device_info() {
1313d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
1314d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1315d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
13162b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockDHCPProvider* dhcp_provider() {
1317d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
1318d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1319d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
13203239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
13213239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
13223239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
13233239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
13242b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockProxyFactory* proxy_factory() {
1325b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
1326b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
1327b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
13282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWiFiProvider* wifi_provider() {
13293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
13303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
13313c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13322b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMac80211Monitor* mac80211_monitor() {
13333946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
13343946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
13353946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
13361964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  void ReportConnectedToServiceAfterWake() {
13371964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan    wifi_->ReportConnectedToServiceAfterWake();
13381964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  }
13391964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
13402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void StartScanTimer() {
13412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->StartScanTimer();
13422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
13432d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
13442b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool ParseWiphyIndex(const Nl80211Message& nl80211_message) {
1345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return wifi_->ParseWiphyIndex(nl80211_message);
1346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; }
1349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1350d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; }
1351d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
13522b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  std::set<uint16_t>* GetAllScanFrequencies() {
1353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return &wifi_->all_scan_frequencies_;
1354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
13562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnScanStarted(const NetlinkMessage& netlink_message) {
1357d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    wifi_->OnScanStarted(netlink_message);
1358d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  }
1359d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
13603cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  bool ScanFailedCallbackIsCancelled() {
13613cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    return wifi_->scan_failed_callback_.IsCancelled();
13623cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
13633cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
136414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  void SetWiFiEnabled(bool enabled) {
136514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan    wifi_->enabled_ = enabled;
136614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  }
136714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
13682b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MOCK_METHOD1(SuspendCallback, void(const Error& error));
1369fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
13702b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  EventDispatcher* event_dispatcher_;
13712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockScanSession* scan_session_;  // Owned by |wifi_|.
13722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWakeOnWiFi* wake_on_wifi_;  // Owned by |wifi_|.
13735c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
13745c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
13753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1377dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
13783426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
1379f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
13802ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
1381c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
13823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
13833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
13843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
13852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMac80211Monitor* mac80211_monitor_;  // Owned by |wifi_|.
13863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
13883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
1391626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
1394446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
1395446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
13967fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1398ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockDBusServiceProxy> dbus_service_proxy_;
1399ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
1400ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
1401f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
1402f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
14032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  DBusManager* dbus_manager_;
1404735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
1405735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
1406735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
14072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  DeviceMockAdaptor* adaptor_;
14082b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantEAPStateHandler* eap_state_handler_;
1409bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
14103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
14113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1412ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1413fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  unique_ptr<MockSupplicantNetworkProxy> supplicant_network_proxy_;
1414af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
14153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1417e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1418e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1419e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1420e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1421446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1422446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
14237fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
14243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1425fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::RemoveBSS(const string& bss_path) {
1426b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1427261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1428261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1429fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuKeyValueStore WiFiObjectTest::CreateBSSProperties(
14302b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const string& ssid,
14312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const string& bssid,
1432050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    int16_t signal_strength,
1433050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    uint16_t frequency,
14342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const char* mode) {
1435fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore bss_properties;
1436fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetUint8s("SSID", vector<uint8_t>(ssid.begin(), ssid.end()));
14373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
14383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
14393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1440a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
14413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
1442fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    bss_properties.SetUint8s("BSSID", bssid_bytes);
14433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1444fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetInt16(WPASupplicant::kBSSPropertySignal, signal_strength);
1445fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetUint16(WPASupplicant::kBSSPropertyFrequency, frequency);
1446fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetString(WPASupplicant::kBSSPropertyMode, mode);
1447050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1448050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  return bss_properties;
1449050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
1450050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1451fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::ReportBSS(const string& bss_path,
1452fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const string& ssid,
1453fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const string& bssid,
1454fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               int16_t signal_strength,
1455fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               uint16_t frequency,
1456fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const char* mode) {
1457050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  wifi_->BSSAddedTask(
1458050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      bss_path,
1459050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode));
14603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
14613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1468a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1469a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1470a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1471a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1473a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1474a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
14759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
14779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1480f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1481a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
14822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
14859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
14869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
14879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
14889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
14899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
14912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                          WiFiEndpointRefPtr* endpoint,
1492fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                          string* bss_path) {
14939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
14949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
14959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
14969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1498fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string dummy_bss_path;
14999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
15009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
15019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
15029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1503a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1504a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
15059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
1506fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        SetupConnectingService("", endpoint, bss_path);
15079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
15089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
15099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
15109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
15119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
15129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
15139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
15142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
15162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1517a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
15192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
15202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1521a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
15222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1523f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1524a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1531f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1532a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1534a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1538a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1539a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1540a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1541a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1542a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1543a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1544a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1545a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1546a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1547a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1548a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1549a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1550a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1551a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1552a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1553a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1555e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1556e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1557e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
15583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
15590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
15600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
15613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
15630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
15640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
15663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15672b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
15682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
15692b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
15702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1571227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1572227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1573227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1574227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1575227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1578227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1579227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1580227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1581227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1582227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1583227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1584227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1585227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1586227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1587227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1588e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan
1589e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  // Do not set supplicant's roam threshold property immediately if the
1590e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  // current WiFi service has its own roam threshold property set.
1591e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1592e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  service->roam_threshold_db_set_ = true;
1593e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  SetCurrentService(service);
1594e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(_)).Times(0);
1595e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1596e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_EQ(kRoamThreshold16, GetRoamThreshold());
1597227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1598227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
15992b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
16000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1605227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1606227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1607227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1608227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1609227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1610227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1611227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1612227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
16132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
16159cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
16169cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
16179cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
16189cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
16199cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
16209cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
16212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16232b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
16240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16289cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
16299cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
16309cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
16319cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16329cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
16332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16352b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
16360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
16390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
16402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
16432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
16442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16472b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
16482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16512b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16522b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16532b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1654549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
16553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
1658fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr));
1659549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1660549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1661c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1662549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1663549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1664549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
1665ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16693c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1671549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1672549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
16730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1674549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1675549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
16765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1678fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _));
1679fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _))
16803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
1681fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1682b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
16833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
16853239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
16873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
1690fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _));
1691fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _))
16925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
1693fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
16945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
16955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
16995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1701835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1703fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
17040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
17060951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  ClearCachedCredentials(service.get());
1707835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1708835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
17090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
17100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
17110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
17120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
17130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
17140427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
17150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1716381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1717fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
1718381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
17193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1720fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(true));
1721381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1722381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1723381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1724ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1725316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1726316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1727316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1728316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
17298e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true))
1730316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
17312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
1732316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1733316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1734316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1735316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1736316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1737316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1738316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
17398e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, true))
1740ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
17412b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
17420951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
1743316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1744316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1745316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1746316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
17478e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, _, false))
1748316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
17492b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
1750ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1751ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1752fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuTEST_F(WiFiMainTest, RemoveNetworkFailed) {
1753fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
17543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1755fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1756381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1757381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1758381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1759381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
17605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
17615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1762fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _))
17633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
1764fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1765fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _));
17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
17673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
17715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
1772fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _))
17735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
1774fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
17755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
17813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
17823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
17833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
17865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
17872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
17882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
17893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
17922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1793f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
17942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
17952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
17962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1798c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1800c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1801c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18020951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1812c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1813c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18140951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1816c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
18172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
18190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1820c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
18213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1822c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
18232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1824c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1825c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1828c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
18292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
18312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1833c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1834c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1840c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1841c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
18425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
18432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
18442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1847f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
18482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
18492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
18502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
18525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18550951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
18592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
18612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
18642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
18662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18680951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
18722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
18740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
18755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
18765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
18772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18810951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
18852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
18865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
18872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18900951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18943cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) {
18953cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  StartScan(WiFi::kScanMethodFull);
18963cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ExpectScanStop();
18973cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
18983cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ReportScanFailed();
18993cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
19003cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
19013cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
19025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
19035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1905ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1906ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19085c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1909ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1910ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
19112f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1912ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1913ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1914ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
19165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
19215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
19225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
19240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
19250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
19260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19303a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) {
19313a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  StartWiFi();
19323a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19333a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19343a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ReportScanDone();
19353fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  CancelScanTimer();
19363fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
19373a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ASSERT_TRUE(wifi()->IsIdle());
19383a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19393a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  OnAfterResume();
19403fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(GetScanTimer().IsCancelled());
19413a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  InstallMockScanSession();
19423a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  SetCurrentService(MakeMockService(kSecurityNone));
19433a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19443a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan}
19463a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan
19475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
19485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1950ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1951ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1953ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1954ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19552f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1956ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1957ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1958ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
19605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
19655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
19685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
19725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1974ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1975ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
1978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
19793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
19813ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1983ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19842f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1985ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1986ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1987ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
19895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
1994fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
19955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
19965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
19975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
19995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2000df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
20015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
20025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20058e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) {
20068e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
2007fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
20088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
20098e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1);
20108e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnAfterResume();
20118e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20128e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
20138e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
20143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
20153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
20163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2017e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
20183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2019e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
20203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2021e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
20223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2023e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
20247fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
2025e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
2026e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
2027e41a72d0737488d561a4158019409d5785dad61bThieu Le
20282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap();
2029e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
2030e41a72d0737488d561a4158019409d5785dad61bThieu Le
2031e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
2032e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
2033e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
2034e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
2035e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
2036e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
2037e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
2038e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
2039e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
2040e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
2041e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
2042e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
20433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
20443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
20453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
20463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
20483c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
2060381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  manager()->set_suppress_autoconnect(true);
20613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
2062381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
2066b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
20670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
2068e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
2069b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
2070e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
2071e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
20728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
20738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
20748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
20758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2077fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
20783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2079fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, &bss_path));
2080ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
20813c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
20858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2087261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
2088261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
2089261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
2090261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
20913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2092fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2094fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, &bss_path));
20953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
20993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
21003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2101835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
2102835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
2103fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath = "/test/path";
21040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
2105835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2106835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2108835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
21120654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2113835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2114835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
2115a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
2116a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
2117fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).Times(0);
21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
2119835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
2120835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
2121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
21220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
21230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2125fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21284943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
21294943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21304943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
21314943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
21324943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
21330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21344943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
21354943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21364943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
21374943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
21384943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
2139fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
21404943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
21414943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21424943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
21433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
21453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
21460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
21500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
21513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
2152fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
21533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
21540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
21573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
21593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
21610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
21623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
21673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
21693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
21700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
21720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
21730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
21750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21762b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
21770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
21803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2181fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
21820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
21833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21844943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
21850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
21880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
21890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
2190835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2191835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
2192ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
2193af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
2194af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
2195af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
2196af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
2197fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true));
2198735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
21993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
22004943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
22014943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
22024943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22044943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22054943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
22064943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22074943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
22084943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
2209fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
22100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22124943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
22134943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22144943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
22154943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
22164943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
22174943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22184943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
2219ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
22204943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
22214943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
22224943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
22234943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
2224fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true));
22254943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
22264943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
22274943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
22284943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
22290654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
22330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
2234c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
22353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2236fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
22370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
2239fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(false));
22403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2241c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
2242c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
2243c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
2244c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
22450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
2247c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
2248c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
22490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
22500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
2251fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
22520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2253fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService("",
22540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
22550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
22580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
22590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
22600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22622b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
22634943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22644943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
22654943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
22664943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22672b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
22682b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
22691aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
22701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
2271fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
22720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22731aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22741aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
22751aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
22761aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
22771aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22781aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
22801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
22811aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22821aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
22831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
22840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
22861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
22881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
22901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
2291d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
2292d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2293fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
22940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2295d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2296d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2297d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2298d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2299d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2300d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
2301d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
2302d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2303d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2304d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23050951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2306d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2308d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2309d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2310d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2312fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
23130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2314d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2315fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service1(SetupConnectedService("",
23160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2317d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2318d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2319d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2320d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2322d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
2323d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(0);
2326d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2328d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2330d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2331d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2332d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2333d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2334d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
2335d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2336fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
23370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
23380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
2339d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
2340d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2341d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2342d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2343d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2344d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2345d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
2346d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
2347d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
2348d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(1);
2349d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2350d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2351d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23520951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2353d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2354d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2355d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2356d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
235717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
23589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
23592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& pending_timeout = GetPendingTimeout();
236017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
23619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
23629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
236344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
236444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
236517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
236617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
236717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
23680d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
23690d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
23700d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")))
237117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
237217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
237317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
237433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
237517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
23760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
237744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
2378a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
237944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
2380a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
2381a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2382a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
23830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
23840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
23850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
238617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
23870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
238833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
238933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
23900951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
23910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
23920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
23930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
239417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
239517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
239617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
23972b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
23982b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& pending_timeout = GetPendingTimeout();
23992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
24003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2401fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
24022b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
24032b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
240417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
240517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
24060d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
24070d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
24080d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")));
240917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
241017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
241117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
241217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
24140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
24150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
24180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
24193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
24200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
24213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
24220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
24230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2427fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
24280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
24293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
2430fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
24313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
24320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
24330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2437c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
24383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
2439fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
24400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
24420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
24433c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
24450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
24470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2449c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2450b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2451c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
24525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
24535c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2454549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
24553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2458fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr));
2459ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
24603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
24623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
24633c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2465549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
24660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2467549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2468549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2469446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
24703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2472fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
24741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24750654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
24770654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
24781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24790654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2481446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
24821aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24830654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
24853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
24873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
24881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2489446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2490446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
2491fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu
24925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2493fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  if (!arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs)) {
2494ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2495ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2496ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2497fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  ByteArrays ssids = arg.GetByteArrays(WPASupplicant::kPropertyScanSSIDs);
2498ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2499ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2500ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2501ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
25023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
25043c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
2506fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  return !arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs);
2507ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2508ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
25105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
25123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
25133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
25143c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
25163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
25175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
25185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
25193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
25203c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
25213c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
25235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
25245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
25255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
25305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
25315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2534ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
25355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25365412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
25375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
25415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
25505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
25515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25573c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
25585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25605412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2561ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2562ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2563ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2564fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2565fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2566fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2567fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2568fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
25693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
25705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2571fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2572fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2573fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
2574fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2575fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2576fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2577fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
25781e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
25791e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
25801e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
25811e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
25821e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
25831e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
2584fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(false));
25851e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
25861e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
25871e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
25881e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
25891e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
25905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
25915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
25925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
25945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
25969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
25977de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
25985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
25995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
26012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
26025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
26045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2607f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2608df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2609df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2610df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2611f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
26125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
26185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
26195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
26215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
26245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
26255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
26265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
262844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
262944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
263044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
263144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
26325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
26339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
26345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
26372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
26387de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
26395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
26415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
26445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
26455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
26465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
26485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
26495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
26510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
26525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
26545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2655a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2656a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
26575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
26590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
26630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
26652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
26662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
26672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
26685412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
26692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
26705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
26722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
26735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
26745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
26750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
26765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
26780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
26792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
26800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
26812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
26820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
26867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
26877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
26887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
26897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
26907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
26910654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
26920654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
26937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
26947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
26957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
26967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
26977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
26987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2699f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
27007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
27017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
27020654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
27037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
27047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
27057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2706d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
27077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
27097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
27107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
27117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
27128e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
27138e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu      .Times(AnyNumber());
2714d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
27157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
27167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2717f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2718bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2719bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2720bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
27217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
27220654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
27230654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
27240654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
27257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
27267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
27277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
27280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
27293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
27307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2732a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
27332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get();
2734a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2735a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2736f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2737fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
2738a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2739a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2740a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2741a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2742a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2743a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2744a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2745a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2746a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2747a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2748a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27492b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get();
2750a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2751a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2752f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2753fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
2754fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
2755fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
2756fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
27570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2758a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2759a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2760a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2761a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2762a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2763a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2765a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2766a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2767a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
27682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2769fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
2770fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
2771fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
2772fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
27730654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2774a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
27750654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2776a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2777a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27781590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
27791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
27803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
27813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
2782fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr);
27831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
27844943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
27850654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
27860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
27870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2788687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
27891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
27901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
27911590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
27921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
27933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
2794fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
27953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
2796fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path1(MakeNewEndpointAndService(
27970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
27983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
27991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2800c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2801c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2802c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2803c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
28043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
28053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
28063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2807bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2808a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
28090654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
28103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2811687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28120951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
28130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
28141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
28151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2816e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2817e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
28180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
28190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
28200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
2822fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
28233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2824fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path =
28253c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
28263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
28273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2828687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
28290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2830687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2831687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2832687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2833687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2834687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2835687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2836687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2837687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2838687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
28390951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(ipconfig.get());
2840687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28414eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
28424eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
28431caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonUpdated) {
28441caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ScopedMockLog log;
28451caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason = 4;
28461caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason_second = 0;
28471caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _))
28481caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein      .Times(AnyNumber());
28491caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), WiFi::kDefaultDisconnectReason);
28501caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(log,
28511caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein              Log(logging::LOG_INFO, _, EndsWith(" DisconnectReason to 4")));
28521caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason);
28531caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason);
28541caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(log,
28551caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein              Log(logging::LOG_INFO, _, EndsWith("Reason to 0 (was 4)")));
28561caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason_second);
28571caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason_second);
28581caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein}
28591caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein
28601caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonCleared) {
28611caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason = 4;
28621caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // Clearing the value for supplicant_disconnect_reason_ is done prior to any
28631caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // early exits in the WiFi::StateChanged method.  This allows the value to be
28641caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // checked without a mock pending or current service.
28651caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason);
28661caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, test_reason);
28671caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
28681caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
28691caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_,
28701caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein            WiFi::kDefaultDisconnectReason);
28711caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein}
28721caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein
28738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
28748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
28753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
2876fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
28773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
28788a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
28793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
2880fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
28813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
28820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
28838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
28848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
288549c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
288649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
2887fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
288849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
288949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
2890fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, &bss_path));
289149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
2892fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
289349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
289449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
289549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
289649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
289749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
289849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
289949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
290049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
290149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
29020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
29030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
290449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
290549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
290649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
29078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
29088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
29098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
29103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2911fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
29128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
29138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
29148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
29154a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
2916fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  return arg.ContainsUint(WPASupplicant::kNetworkPropertyScanSSID) &&
2917fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      arg.ContainsUint(WPASupplicant::kNetworkPropertyDisableVHT) &&
2918fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      arg.ContainsString(WPASupplicant::kNetworkPropertyBgscan) == bgscan;
29194d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
29204d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
29214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
29224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
29233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
29240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2925a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
2926fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2927fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu              AddNetwork(WiFiAddedArgs(true), _));
29280654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
29294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
29304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
29314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
29324a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
29343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
29350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2936a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
2937fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2938fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu              AddNetwork(WiFiAddedArgs(false), _));
29394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
29404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
29424a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
29434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2944f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
29454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
2947fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
29490951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
2951fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
29524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
2955fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
29570951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29580951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
2960fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
2961fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    config_string = params.GetString(WPASupplicant::kNetworkPropertyBgscan);
29624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
29634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
29644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
29664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
29674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
29710654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
2972fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
2976fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
2977fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string config_string =
2978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        params.GetString(WPASupplicant::kNetworkPropertyBgscan);
29794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
29804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
29814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
29834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29855c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
29865c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
29870654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
2988fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29905c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
29910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29925c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
2993fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
29945c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
29954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2997c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2998c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
29993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
3000fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
3001c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
3002c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
3003c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
3004c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3005c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
3006c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
30070951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3008c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
3009c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3010c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
3011c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
30123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
3013fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
30148f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
3015c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
30168f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
30178f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
30180654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
30195519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
30203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
30213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
30223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
30238f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
30248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
30255519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
30265519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
30273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
30283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
30293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
30300654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3031c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
3032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3033b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
3034b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
3035b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
3036b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
3037b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
3038b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
3039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
3040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
3041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
3043b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
3044b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
3045b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
3046b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
30472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantBSSProxy* proxy = supplicant_bss_proxy_.get();
3048b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
3049b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
3050fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path(
30510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
30520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
30533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
3054b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
3055b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
3056b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
3057b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3058b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
30595c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
30605c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
30615c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
30625c05b2920be742d518829972127172481722058dmukesh agrawal
30635c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
30645c05b2920be742d518829972127172481722058dmukesh agrawal
30655c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
30665c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
30675c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
30683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
30695c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
30702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
30715c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
30725c05b2920be742d518829972127172481722058dmukesh agrawal}
30735c05b2920be742d518829972127172481722058dmukesh agrawal
3074402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) {
3075402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  StartWiFi();
3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
30774b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto-
30784b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // connectable services.
3079402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3080402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
3081402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30824b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _));
3083402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3084402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3085402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If we have 1 or more auto-connectable services, do not call
3086402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3087402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3088402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(1));
3089402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30904b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3091402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3092402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3093402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3094402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If the WiFi device is not Idle, do not call
3095402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3096402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  SetCurrentService(MakeMockService(kSecurityWep));
3097402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_FALSE(wifi()->IsIdle());
3098402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3099402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
31004b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3101402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3102402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3103402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan}
3104402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
31055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
31065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
3107b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3108b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31137de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
31140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3115b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
3116b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3117b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3118b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3119b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3120b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
31225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
31235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
31255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
31265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
31270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3128df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
31295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
31305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
31315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
31335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
31345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3137b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3141b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
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
3150b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
3151b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3152b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
31533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
3154fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr);
3155b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3158b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
3160b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3161b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3162b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3163b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3164b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) {
31662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EnableFullScan();
31672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartWiFi();
31682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  ReportScanDone();
31702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  CancelScanTimer();
31712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
31722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
31732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
31742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true));
31762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31772d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  FireScanTimer();
31782d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31792d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());  // Do not re-arm.
31802d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
31812d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3182b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
3183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3184b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3185b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
3188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
3192b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3193b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3197b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
3201b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3202b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3203b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
3205b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3206b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3207b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
32095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
32105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
32115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
3212fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
32135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
32145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
32155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
3216a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
32175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
32195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
32205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
32215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
32225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
32235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
32245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3225b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
3226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
32285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
3229fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
3230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
32313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
32323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
32333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
3234a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
32353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
32375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
32380654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3239b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3240b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3241b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3242b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
3243b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3245fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
3246b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
3247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
32483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32493c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
32500654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3251b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3252b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3253b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
32553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
32562ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
32583c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
32592ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
32603c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
32613c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
32623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
32632ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
32652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
32663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
32673c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
3268daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32693c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
32732ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
32742ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
32752ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
32762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32772ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
32782ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32792ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32802ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
3281a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3282a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  SetCurrentService(service);
32832ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
32843c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3285daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
3286fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach())
3287fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(true));
32883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3290a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu
3291a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  // Service is unreliable, skip reassociate attempt.
3292a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  service->set_unreliable(true);
3293a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3294a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu                       EndsWith("skipping reassociate attempt."))).Times(1);
3295a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
3296a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  OnLinkMonitorFailure();
3297a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32983c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
32993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
33008e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) {
33018e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
3302fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
33038e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
33048e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1);
33058e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnUnreliableLink();
33068e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
33078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
33088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
3309cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
3310f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3311bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
3313cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3314cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3315bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
3316f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
33170654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3318bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3319bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
3320bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
33210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3323bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
33241369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
3325cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3326cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
3330f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
3331a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3332f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
3338f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
3339f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
33408e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
33418e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu      .Times(AnyNumber());
3342f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3347f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3348f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
33490951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3350f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3351f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
3352f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
3355f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3356f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3357f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
3358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
3359f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
33640d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
3367f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33680951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3369f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
3371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
3372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
33740d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33750d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
3377f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33780951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3379f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
3381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
3382f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3383f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
3384f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
33850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
33860d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
33870d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    StrEq("OnIPConfigFailure")));
3388f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
3389f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
3390f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
33911369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
3392f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3393735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3394735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3395735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
3396735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3397735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3398bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
34000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3401bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3402bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
34031369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3404bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
34051369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
34060951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3407bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3408bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
34090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
34100951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3411bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3412bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3413bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
34140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
34151369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
34161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
34171369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
3418f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
3419cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3421cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3422a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3423bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3424f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
34254943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3426735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3427cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3428f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
34290654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
34301369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
34311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
34321369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
3433f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
34341369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
34351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
3436735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3437735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
34384943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3439735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
3440735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
3441735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
3442735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3443735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3444bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3445735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
34461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
344739a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
3448735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
34490654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3450cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3451cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
34521964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) {
34531964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
34541964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan              ReportConnectedToServiceAfterWake(IsConnectedToCurrentService()));
34551964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  ReportConnectedToServiceAfterWake();
34561964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
34571964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
3458e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
34601aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
3461e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
34621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34701aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3475e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
3476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
3477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
3478e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
3481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
3488e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
3493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
3494e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3495e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3496e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
3497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
3498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
3499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
35021aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
350366bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer.
350466bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
3506e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
3507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
3508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
3512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3515e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
3516e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3517e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3518e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3519e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3520e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3521e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3522e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3523e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
35241aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
35251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
35261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
3528fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
35291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
35361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
35421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
35501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
35521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35537cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
35557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
3560fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
35617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35645412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
35717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
35747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
35757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
35767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
35827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
35867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
35897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
35907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
35915412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
35927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
35947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
35957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
35987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
35997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
36007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3601baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3602baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3603baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3604baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
36057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
36067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
36077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
36087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
36097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
36107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
36117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
36127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
36137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
36147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
36157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
36177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3639baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3640baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3641baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3642baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3643baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3657baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3658baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3659baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3660baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3661baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3662baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3663baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3664baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
36667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
36677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
36687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
36697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
36708e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
36717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
36727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
36737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3674baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3675baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3676baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3677baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3678baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3679baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3680baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3681baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3682baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3683baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3684baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3685baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3686baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3687baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3688baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3689baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3690baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3691baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3692baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3693baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3694baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3695baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3696baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3697baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3698baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3699baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3700baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3701e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3708e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3709e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3711e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3712e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3716e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3717e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3718e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3719e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3720e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3721e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3722e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3723e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3724e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3725e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3726e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3727e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3728e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3729e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3730e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3731e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3732e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3733e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3734e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3735e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3736e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3737e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
37388e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
37398e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3740e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3741e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3742e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3743e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3744e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3745e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
37467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
37477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
37481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) {
37491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
37501964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
37511964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  StartWiFi();
3752fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
37531964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(
37541964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      mock_dispatcher_,
37551964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds));
37561964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  OnAfterResume();
37571964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
37581964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
37592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) {
37602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  // Return immediately if scan interval is 0.
37622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(0, &e);
37632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
37642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) {
37682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(1);
37722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_,
37732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan              PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000));
37742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37772d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) {
37782d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37792d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37802d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37812d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(0);
37822d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000));
37832d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37842d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37852d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3786bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3787f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3788bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3789bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3790bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3791bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3792fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore args;
3793bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3794bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3795bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3796bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3797bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3798bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3799bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3800bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
38017fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
3802fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  args.SetUint(WPASupplicant::kInterfacePropertyDepth, kDepth);
3803bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3805bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3806bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3807bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3808bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3809bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
3810fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  args.SetString(WPASupplicant::kInterfacePropertySubject, kSubject);
3811bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3812bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3813db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3814db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
38153cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) {
38163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanFailedTask if scan failed.
38173cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
38183cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_,
38193cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan              PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds));
38203cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(false);
38213cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_FALSE(ScanFailedCallbackIsCancelled());
38223cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
38233cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed
38243cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // callback if has been dispatched.
38253cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_));
38263cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(true);
38273cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
38283cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
38293cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
3830db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
383111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3832db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3833db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3834735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3835735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3836735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3837735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3838db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3839db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3840db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3841f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3842db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3843735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3844db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3845735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
38460951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3847735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3848db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3849735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3850735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3851735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
38520d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
38530d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38540d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
3855735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
385611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
38572b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockEapCredentials* eap = new MockEapCredentials();
385811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
385911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
386011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
386111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
386211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
386311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
386411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
386511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
386611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
38670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
38680d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38690d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
387011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
387111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
387211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
387311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
387411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
387511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
387611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
387711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
38780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
387911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
388011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
388111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
388211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
388311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3884bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3885bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3886c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3887c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3888c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3889c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3890c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3891c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3892c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3893c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3894c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3895c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3896c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3897c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
38986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
39037fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
39046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
39056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
39086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
39096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
39106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
39116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
39126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
39136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
39146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
39156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
39166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
39176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
39186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
39196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
39206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
39226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
39236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
39246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
39256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
39266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
39286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
39296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
39306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
39316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
39326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
39336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
39347347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
39357347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
39366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39375581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
39382b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_.get();
39395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
39415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
3942fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
39435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
3948fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3949fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3950fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
3951fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
39545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
39575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
3958fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3959fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3960fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)),
3961fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3962fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3963fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)),
3964fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3965fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3966fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3967fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelExcessive)),
3968fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3969fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3970fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3971fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelExcessive)),
3972fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3973fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3974fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3975fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelMsgDump)),
3976fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3977fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3978fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3979fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelMsgDump)),
3980fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3981fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3982fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3983fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelWarning)),
3984fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3985fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3986fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3987fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelWarning)),
3988fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
40005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
40015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
4002fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
4003fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
4004fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
4005fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
40060654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
40075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
40085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
40105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
40115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
40125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
4013fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
4014fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
4015fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
4016fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
40170654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
40185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
40195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
40215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
40225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
40235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
4024fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
4025fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
4026fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
4027fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
4028fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
4029fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
4030fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
40315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
40325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
40355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
4036fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
40375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
40385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
40395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
40425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
404350cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
404450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
404550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
404650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
404750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
4048bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
4049bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
4050bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
4051bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
4052bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4053bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40547fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
4055bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4056bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
4057bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4058bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4059bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
4060bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4061bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4062bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4063bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
4064bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4065bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40667fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
4067bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4068bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4069bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4070bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4071bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4072bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4073bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4074bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4075bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
4076bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4077bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
4078bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
4079bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4080bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4081bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
4082bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
40830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
40840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40850cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
40869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
40870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
4088a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4089a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4090a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4091a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4092a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
40957de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
40960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
40970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
40980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
41000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
41010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
41020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41030cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
41049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
41050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
4106fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
41079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
41089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
41099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
41100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
41130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
41170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
41190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
41200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
41210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
41230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
41240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
41250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41260cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
41279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
41280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
4129fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
41309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
41319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
41320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
41350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
41390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
41410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
41420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
41430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
41450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
41460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
41470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
4148df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
41499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4150df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
41519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
41529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
4153df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4154df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
4155a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4156a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
4157a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
41589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4159df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4160df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4162df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
4165df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
4166df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4167df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4168df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4170df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4171b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
4172b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4173b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
4174df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
4175b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
4176b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4181a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4182df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4183b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
4184b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
4185b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
4186b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4187df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
4188df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4192a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4194df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4195df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4196df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
42000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
42029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4203df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4204df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
4205a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4206a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
4208fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
4209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
4212a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4213a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
42149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
4219df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
4220df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
4221fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
4222df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
42250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
4226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4228a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
4229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
42329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4233df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4234a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4235fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).
4236fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      WillOnce(Return(false));
4237df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4240f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
4241f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4242a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
4243df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
4244df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4245df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
4246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
42490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
42500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
42510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
4252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
42539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4255df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
4257a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4258a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4259f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4260df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
4261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
4264a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4265df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4266df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
4269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
4273df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
4274f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
4275a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
4276a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
42772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
4278df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
4279a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
4280a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4281a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4282a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4283df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
4284df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
4285a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4286df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4287df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
4288a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4289df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4290df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
4291fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
4292a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4293df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4294df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4295df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4296df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
4297df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4298df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
4299df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
4300fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", &endpoint, &bss_path);
4301df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4302df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
4303a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
4304df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
4305df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
4306df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4307df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4308df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4309df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4310df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
43113bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
43123bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
4313fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
43143bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
43153bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
43163bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
43172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
43183bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
43193bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
43203bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
43213bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
43227de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
43233bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
43243bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
43253bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
43263bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
43272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
43282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
43292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
43312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
43322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
43332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
43342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
43352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
43362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
43432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
43442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
43462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
43472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
43482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
43492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
43502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
43512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
4357618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, TDLSDiscoverResponse) {
4358618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  const char kPeer[] = "peer";
43592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>();
4360618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  SetTDLSManager(tdls_manager);
43613c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
4362618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_CALL(*tdls_manager, OnDiscoverResponseReceived(kPeer));
4363618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  TDLSDiscoverResponse(kPeer);
4364618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  Mock::VerifyAndClearExpectations(tdls_manager);
4365618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu}
4366c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4367618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, PerformTDLSOperation) {
4368618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  const char kPeerMac[] = "00:11:22:33:44:55";
43692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>();
4370618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  SetTDLSManager(tdls_manager);
4371618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu
4372618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  Error error;
437362abf31989c52dc1e4ee5aae71664ba81d6fe2dbPeter Qiu  // No address resolution is performed since MAC address is provided.
4374618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_CALL(*tdls_manager,
4375618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu              PerformOperation(kPeerMac, kTDLSStatusOperation, &error))
4376618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu      .WillOnce(Return(kTDLSConnectedState));
4377618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_EQ(kTDLSConnectedState,
4378618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu            PerformTDLSOperation(kTDLSStatusOperation, kPeerMac, &error));
4379618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_TRUE(error.IsSuccess());
4380c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
4381c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
43823946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
4383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage new_wiphy_message;
4384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  new_wiphy_message.InitFromNlmsg(
43852b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      reinterpret_cast<const nlmsghdr*>(kNewWiphyNlMsg),
4386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan      NetlinkMessage::MessageContext());
43873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
4388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_));
4389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex));
4390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  GetAllScanFrequencies()->clear();
43913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
4392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies),
4393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan            GetAllScanFrequencies()->size());
4394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) {
4395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    EXPECT_TRUE(GetAllScanFrequencies()->find(freq) !=
4396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                GetAllScanFrequencies()->end());
4397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
43983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
43993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
44003946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
44013946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
44023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
44033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
44043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
44053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
44063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
44073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
44083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
44093c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) {
4410787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopedMockLog log;
4411787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4412787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
44134bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
4414787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained")));
4415787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _));
4416787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
4417787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPConfigComplete();
4418787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4419787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained")));
4420787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _));
4421787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPv6ConfigComplete();
4422787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
44233c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was
44243c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  // triggered by a gateway ARP.
44253c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received")));
44263c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0);
44273c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  ReportIPConfigCompleteGatewayArpReceived();
44283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan
4429787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4430787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4431787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4432787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4433787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) {
443414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(true);
4435c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan  EXPECT_CALL(
4436c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan      *wake_on_wifi_,
4437d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan      OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _));
4438787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnBeforeSuspend();
443914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
444014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(false);
444114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  EXPECT_CALL(*wake_on_wifi_,
444214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan              OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _))
444314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan      .Times(0);
444414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  OnBeforeSuspend();
4445787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4446787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4447787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) {
444814ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(true);
4449787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
4450d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan              OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _));
4451787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnDarkResume();
445214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
445314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(false);
445414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  EXPECT_CALL(*wake_on_wifi_,
445514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan              OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _))
445614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan      .Times(0);
445714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  OnDarkResume();
44583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
44593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
44603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) {
44613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  StartWiFi();
44623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x);
44633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x);
44643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId1[] = "/service/network/rpcid1";
44653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId2[] = "/service/network/rpcid2";
4466fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string path1(kNetworkRpcId1);
4467fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string path2(kNetworkRpcId2);
44683fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service1, kNetworkRpcId1);
44693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service2, kNetworkRpcId2);
44703fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_FALSE(RpcIdByServiceIsEmpty());
44713fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1));
44723fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2));
44733fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  RemoveSupplicantNetworks();
44743fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(RpcIdByServiceIsEmpty());
44753fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
44763fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
44775d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) {
44785d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
44795d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  Device::ScanType scan_type = Device::kFullScan;
44805d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
44815d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
44825d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]")));
44835d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
44845d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
44855d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  scan_type = Device::kProgressiveScan;
44865d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
44875d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]")));
44885d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
44895d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan}
44905d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
44913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) {
44923fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const Device::ScanType scan_type = Device::kFullScan;
44933fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
44943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
44953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(1);
44963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
44973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetPendingService(service);
44983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
44993fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45003fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(
45013fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      log,
45023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
45035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
45043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
45053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
45063fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
45073fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
45085d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) {
45095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
45104b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  StartWiFi();
45115d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
45123fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
45135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
45145d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
45155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
45165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _));
45175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
45185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
45195d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_TRUE(manager()->suppress_autoconnect());
45203fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
45213fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
45225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) {
45235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
45243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
45255d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
45265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  SetPendingService(service);
45275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
45285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
45293fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45305d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(
45315d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      log,
45325d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
45335d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
45345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
45355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
45365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _)).Times(0);
45375d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0);
45385d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
45395d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
45403fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
45413fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
45425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) {
4543381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  ScopedMockLog log;
45445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
45455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
45465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
4547381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_CALL(netlink_manager_,
4548381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4549381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                                  TriggerScanMessage::kCommand),
4550381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                 _, _, _));
45515d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
45535d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(0);
45545d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
45555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
45565d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4557381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan}
4558381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan
45595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) {
45605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
45615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
45625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
45635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs = {1};
45643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(netlink_manager_,
45653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
45663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                                  TriggerScanMessage::kCommand),
45673fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                 _, _, _));
45685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45695d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
45705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(1);
45715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
45725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
45735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4574787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4575787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4576050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) {
4577050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // This test essentially performs ReportBSS(), but ensures that the
4578050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // WiFi object successfully dispatches events in order.
4579050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  StartWiFi();
4580050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4581050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss0",
4582050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0,
4583050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4584050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4585050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss1",
4586050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0,
4587050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4588050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSRemoved("bss0");
4589050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4590050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss2",
4591050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0,
4592050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4593050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4594050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00");
4595050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
4596050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
4597050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4598050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  InSequence seq;
4599050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0)));
4600050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1)));
4601050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiServiceRefPtr null_service;
4602050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0)))
4603050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      .WillOnce(Return(null_service));
4604050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2)));
4605050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  dispatcher_.DispatchPendingEvents();
4606050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
4607050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
46082b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap();
4609050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_EQ(2, endpoints_by_rpcid.size());
4610050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
4611050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4612235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) {
4613235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag
4614235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // for having the wiphy index is set by ParseWiphyIndex.
4615235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex);
4616235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
46172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr*>(kNewWiphyNlMsg),
4618235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                    NetlinkMessage::MessageContext());
4619235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_TRUE(ParseWiphyIndex(msg));
4620235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex);
4621235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4622235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4623235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) {
4624235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  ScopedMockLog log;
4625235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ
4626235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // U32 attribute, so that this message no longer contains a wiphy_index to be
4627235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // parsed.
4628235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
4629235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  uint8_t message_memory[sizeof(kNewWiphyNlMsg)];
4630235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  memcpy(message_memory, kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg));
46312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  struct nlattr* nl80211_attr_wiphy = reinterpret_cast<struct nlattr*>(
4632235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan      &message_memory[kNewWiphyNlMsg_Nl80211AttrWiphyOffset]);
4633235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ;
46342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr*>(message_memory),
4635235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                    NetlinkMessage::MessageContext());
4636235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4637235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
4638235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                       "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY"));
4639235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_FALSE(ParseWiphyIndex(msg));
4640235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0);
4641235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4642235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4643d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) {
4644d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4645d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
46462b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr*>(kActiveScanTriggerNlMsg),
4647d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan                    NetlinkMessage::MessageContext());
4648d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true));
4649d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4650d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4651d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4652d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) {
4653d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4654d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
4655d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  msg.InitFromNlmsg(
46562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      reinterpret_cast<const nlmsghdr*>(kPassiveScanTriggerNlMsg),
4657d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan      NetlinkMessage::MessageContext());
4658d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false));
4659d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4660d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4661d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4662853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4663