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