1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
17d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi.h"
18853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
19f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h>
205c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h>  // Needs typedefs from sys/socket.h.
215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h>
225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h>
23f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
2811c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h>
30a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
31a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
32a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
33a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
34289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__)
35289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h>
36289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else
37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
38289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif  // __ANDROID__
39853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
40675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_config.h"
41675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_provider.h"
42125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h"
4326b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
45397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h"
467a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
47b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
50853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
51c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
5211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
53e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
54687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h"
553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
56cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
572ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
583426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
5910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
60a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
6102e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h"
628d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h"
6302e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h"
648d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h"
658d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h"
6602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h"
67b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart#include "shill/net/netlink_packet.h"
6802e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h"
6902e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h"
70dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
71853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
72da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h"
73da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h"
74da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h"
75da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h"
76da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h"
77da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h"
7885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
79e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu#include "shill/test_event_dispatcher.h"
80af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
81d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h"
82d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h"
83618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu#include "shill/wifi/mock_tdls_manager.h"
84d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h"
85d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h"
86d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h"
87d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h"
88d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h"
89d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h"
90d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h"
91853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
920e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
93a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set;
96853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
97ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr;
98853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
1003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
1013c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
1026f99f2cb25bead57398151880118a7794d5428a3Samuel Tanusing ::testing::ContainsRegex;
1033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
104a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
105cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
1060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
1073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
108b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
109549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
1115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
1125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
1135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
1147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
115dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
116d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
11711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref;
118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
119af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew;
120ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
121ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
122a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
123a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
124a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
125853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
1268ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
127853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
128853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
129853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
136c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234;
137235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
138235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi
139235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// capabilities of a NIC with wiphy index |kNewWiphyNlMsg_WiphyIndex| which
140235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// supports operating bands with the frequencies specified in
141235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// |kNewWiphyNlMsg_UniqueFrequencies|.
142235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint8_t kNewWiphyNlMsg[] = {
143235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x68, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
144235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xf6, 0x31, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
145235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30,
146235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00,
147235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00,
148235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff,
149235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00,
150235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x00, 0x00,
151235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00,
152235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd1, 0x08, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
153235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00,
154235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x8b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x18, 0x00, 0x39, 0x00,
155235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 0x02, 0xac, 0x0f, 0x00,
156235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0xac, 0x0f, 0x00, 0x06, 0xac, 0x0f, 0x00, 0x05, 0x00, 0x56, 0x00,
157235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00,
158235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x03, 0x00, 0x00, 0x00,
159235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x69, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6a, 0x00,
160235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00,
161235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
162235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00,
163235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x09, 0x00, 0x50, 0x05, 0x16, 0x00, 0xf8, 0x01, 0x00, 0x00,
164235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00,
166235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00,
167235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00,
168235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00,
169235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00,
170235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
171235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00,
172235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
173235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00,
174235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00,
175235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
176235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00,
177235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
178235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00,
179235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00,
180235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
181235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00,
182235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
183235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00,
184235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00,
185235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
186235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00,
187235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa3, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
188235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00,
189235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
190235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00,
191235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb4, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
192235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
193235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
194235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00,
195235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x00,
196235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00,
197235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00,
198235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00,
199235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
200235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
201235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00,
202235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00,
203235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00,
204235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0b, 0x00,
205235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x54, 0x03, 0x01, 0x00,
206235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00,
208235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00,
209235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0x00,
210235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00,
211235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00,
212235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
213235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
214235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00,
215235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00,
216235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
217235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00,
218235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x8c, 0x14, 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, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 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, 0x06, 0x00,
223235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 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, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00,
226235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc8, 0x14, 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, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 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, 0x09, 0x00,
231235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 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, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00,
234235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa4, 0x15, 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, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 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, 0x0c, 0x00,
239235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 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, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00,
242235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
243235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
244235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00,
245235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
246235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00,
247235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
248235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
249235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00,
250235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
251235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
252235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00,
253235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
254235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00,
255235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
256235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
257235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00,
258235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
259235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x16, 0x00, 0x00,
260235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00,
261235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00,
262235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
263235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00,
264235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
265235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
266235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc1, 0x16, 0x00, 0x00,
267235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00,
268235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
269235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00,
270235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00,
271235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00,
272235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00,
273235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00,
274235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
275235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
276235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xd4, 0x00, 0x32, 0x00,
277235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00,
278235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00,
279235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00,
280235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x19, 0x00, 0x00, 0x00,
281235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00,
282235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x00,
283235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00,
284235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x00, 0x00,
285235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00,
286235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x43, 0x00, 0x00, 0x00,
287235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00,
288235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x42, 0x00, 0x00, 0x00,
289235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x13, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00,
290235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x00,
291235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x16, 0x00, 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00,
292235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00,
293235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x19, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00,
294235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x88, 0x13, 0x00, 0x00,
295235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x6c, 0x00, 0xac, 0x03, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00,
296235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
297235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
298235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
299235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
300235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
301235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
302235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
303235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
309235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
310235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
311235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
315235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
316235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
317235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
318235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
319235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00,
341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
344235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
351235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00,
352235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
360235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00,
363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
367235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
368235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
372235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
373235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x14, 0x01, 0x64, 0x00,
374235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00,
375235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00,
376235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
377235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
378235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
379235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00,
380235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
381235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
382235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00,
385235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
387235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00,
388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00,
391235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00,
392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00,
394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00,
397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x50, 0x00, 0x78, 0x00,
398235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x4c, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00,
399235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00,
400235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00,
401235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x18, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,
402235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x0c, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x09, 0x00,
403235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00,
404235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00,
405235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1e, 0x00, 0x94, 0x00, 0x42, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
406235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
408235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint32_t kNewWiphyNlMsg_WiphyIndex = 2;
409b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewartconst int kNewWiphyNlMsg_Nl80211AttrWiphyOffset = 4;
410235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint16_t kNewWiphyNlMsg_UniqueFrequencies[] = {
411235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457,
412235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    2462, 2467, 2472, 2484, 5180, 5200, 5220, 5240, 5260, 5280,
413235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640,
414235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825};
4155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
416d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint32_t kScanTriggerMsgWiphyIndex = 0;
417d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kActiveScanTriggerNlMsg[] = {
418d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x44, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
420d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
421d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x2c, 0x00,
423d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
424d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00,
425d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
426d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00,
427d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00,
428d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00,
429d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00,
430d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00,
431d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00,
432d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00,
433d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00,
434d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00,
435d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00,
436d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00,
437d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00,
438d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00,
439d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00,
440d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00,
441d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00,
442d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00,
443d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00,
444d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00};
445d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
446d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kPassiveScanTriggerNlMsg[] = {
447d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x40, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
449d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
450d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x04, 0x00, 0x2d, 0x00, 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00,
452d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00,
453d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00,
454d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00,
455d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
456d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00,
457d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00,
458d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00,
459d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00,
460d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00,
461d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00,
462d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00,
463d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00,
464d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00,
465d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00,
466d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00,
467d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00,
468d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00,
469d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00,
470d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00,
471d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00,
472d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00,
473d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00};
474d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
4765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
4773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
478853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
4793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
4800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      : metrics_(nullptr),
4813946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        device_(
4823946da840142cd386d628c0e879459f8976bd86dmukesh agrawal            new WiFi(control_interface(), dispatcher(), &metrics_,
4833946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                     manager(), "wifi", "", kInterfaceIndex)) {
484853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
4853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
486853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
487853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
4883946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMetrics metrics_;
4898abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
490853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
491853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
4923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
493f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(device_->store().Contains(kNameProperty));
494de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
495853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
496853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
4976bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
498a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
499e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    Error error;
500e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_TRUE(device_->mutable_store()->SetAnyProperty(
501e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu        kBgscanSignalThresholdProperty, PropertyStoreTest::kInt32V, &error));
502a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
503a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
504e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    Error error;
505e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_TRUE(device_->mutable_store()->SetAnyProperty(
506e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu        kScanIntervalProperty, PropertyStoreTest::kUint16V, &error));
507a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
508853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
509a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
510e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    Error error;
511e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_FALSE(device_->mutable_store()->SetAnyProperty(
512e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu        kScanningProperty, PropertyStoreTest::kBoolV, &error));
513e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ASSERT_TRUE(error.IsFailure());
514e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_EQ(Error::kInvalidArguments, error.type());
515a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
516853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
5174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
518e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    Error error;
519e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_TRUE(device_->mutable_store()->SetAnyProperty(
520f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
52103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko        brillo::Any(string(WPASupplicant::kNetworkBgscanMethodSimple)),
5224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
5254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
526e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    Error error;
527e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    EXPECT_FALSE(device_->mutable_store()->SetAnyProperty(
528f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
52903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko        brillo::Any(string("not a real scan method")),
5304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
5334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
5344a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
5350654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
5368abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
5374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
5394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
540e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
541e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
542f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5440654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
5458abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
546e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  Error error;
547e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_TRUE(device_->mutable_store()->SetAnyProperty(
548f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty,
54903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko      brillo::Any(string(WPASupplicant::kNetworkBgscanMethodLearn)),
5508abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
5510654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
552e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
553f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5540654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
5558abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
556e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_TRUE(device_->mutable_store()->ClearProperty(
557e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu      kBgscanMethodProperty, &error));
558e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
559f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5628abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
5638abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5643c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
572e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
5733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
57477994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // Note: When this constructor is called (via the initialization lists in the
57577994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // constructors of WiFiMainTest and WiFiTimerTest), |dispatcher| will point to
57677994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // an uninitialized EventDispatcher. Any functions (including constructors in
57777994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // the initialization list) that use the message loop should not be called in
57877994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // this constructor, since the delayed initialization of the message loop can
57977994d69bae79ce07d3830c4f83144503a06b224Samuel Tan  // cause concurrency-related bugs. (See crbug.com/509138 for an example.)
5802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  explicit WiFiObjectTest(EventDispatcher* dispatcher)
581e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
5820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        metrics_(nullptr),
583bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal        manager_(&control_interface_, nullptr, &metrics_),
584e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
585fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_,
586fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan                       kDeviceName, kDeviceAddress, kInterfaceIndex)),
5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
588fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        mac80211_monitor_(new StrictMock<MockMac80211Monitor>(
589fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold,
590fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            base::Closure(), &metrics_)),
591dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
592af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()),
593af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)),
5940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
595735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
597fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu            new NiceMock<MockSupplicantInterfaceProxy>()),
598fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        supplicant_network_proxy_(new NiceMock<MockSupplicantNetworkProxy>()) {
5993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->mac80211_monitor_.reset(mac80211_monitor_);
600e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    wifi_->supplicant_process_proxy_.reset(supplicant_process_proxy_);
6015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
602e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ON_CALL(*supplicant_process_proxy_, CreateInterface(_, _))
603fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
604fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
605e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ON_CALL(*supplicant_process_proxy_, GetInterface(_, _))
606fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
607fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
608fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), AddNetwork(_, _))
609fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(DoAll(SetArgumentPointee<1>(string("/default/path")),
610fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                             Return(true)));
611fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), Disconnect())
612fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
613fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), RemoveNetwork(_))
614fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
615fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_interface_proxy_.get(), Scan(_))
616fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
617fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    ON_CALL(*supplicant_network_proxy_.get(), SetEnabled(_))
618fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(Return(true));
619c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
6203946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_))
6213946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        .Times(AnyNumber());
6223946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
6238e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    ON_CALL(dhcp_provider_, CreateIPv4Config(_, _, _, _))
624af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(Return(dhcp_config_));
625af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true));
6262d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false));
627af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan
628e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ON_CALL(control_interface_, CreateSupplicantInterfaceProxy(_, _))
629af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_));
630e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ON_CALL(control_interface_, CreateSupplicantBSSProxy(_, _))
631af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_));
632e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    ON_CALL(control_interface_, CreateSupplicantNetworkProxy(_))
633fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        .WillByDefault(ReturnAndReleasePointee(&supplicant_network_proxy_));
634318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
635ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
636735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
637735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
6382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
6393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
6405c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
641bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
6425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
6430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
6445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
6465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
6475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
6485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
6495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
6503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6515c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
6533ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
6543ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
655d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
6562b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    static_cast<Device*>(wifi_.get())->rtnl_handler_ = &rtnl_handler_;
6575c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
6592b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
660b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
66177994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // Must be called here instead of in the constructor so that the destructor
66277994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // of SimpleAlarmTimer will not be invoked before the EventDispatcher is
66377994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    // properly constructed (crbug.com/509138).
66477994d69bae79ce07d3830c4f83144503a06b224Samuel Tan    InstallMockWakeOnWiFi();
6655c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
6665c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6675c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
6683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
6690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        .WillRepeatedly(Return(nullptr));
6700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SelectService(nullptr);
671b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
672b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
673b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
6743946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
6753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
6773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
6780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->Stop(nullptr, ResultCallback());
6790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->set_dhcp_provider(nullptr);
6803ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
6813ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
682d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
683f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
684f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
685549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
686549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
6873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
6880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(false);  // Stop(nullptr, ResultCallback());
689549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
690549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
69117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
6920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    SetPendingService(nullptr);
69317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
694c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
7015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
7025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
7055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
7065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
7075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
7115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
7125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
7155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
7165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    set<uint16_t> available_frequencies;
7175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
7185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
7195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
7205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
7215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
7225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
7235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
727f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
7280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                        nullptr);
7295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
7305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
732fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  void InstallMockWakeOnWiFi() {
733fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_,
7341897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan                                       &metrics_);
735fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wifi_->wake_on_wifi_.reset(wake_on_wifi_);
736fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  }
737fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan
7385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
7395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
7405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
7415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7432b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnTriggerScanResponse(const Nl80211Message& message) {
7445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
7455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
747b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
748b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
7492b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                    const char* reason) {
750b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
751b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
752b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
7539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
7540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
7550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
7560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
7570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
7587fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void SetRoamThresholdMember(uint16_t threshold) {
759227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    wifi_->roam_threshold_db_ = threshold;
760227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
761227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7627fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetRoamThreshold(uint16_t threshold) {
763227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->SetRoamThreshold(threshold, nullptr);
764227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
765227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7667fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t GetRoamThreshold() const {
767227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->GetRoamThreshold(nullptr);
768227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
769227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
7717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
7727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
7732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Simulate the course of events when the last endpoint of a service is
7743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
7753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
776bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
7772b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr& service)
778bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
779bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
780bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
781bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
7822b363903f38a515001c5edc7202403fcddb15a01Paul Stewart        const WiFiEndpointConstRefPtr& endpoint) {
783bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
784bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
785bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
7863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
7873c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
7893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
7903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
7913c5040174273386868cc8dea8044d22c465885d8Paul Stewart
7922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  EndpointRemovalHandler* MakeEndpointRemovalHandler(
7932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiServiceRefPtr& service) {
7943c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
7953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
796b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
797b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
798b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
7993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
8003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
8032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char* mode,
8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
8052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* ssid,
8062b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* path,
8072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                     string* bssid) {
8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
8093c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
810a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      *ssid = StringPrintf("ssid%d", bss_counter_);
8113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
812a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *path = StringPrintf("/interface/bss%d", bss_counter_);
813a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_);
8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
8163c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
8173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string& ssid, const string& bssid) {
8203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
8213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
8232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const string& ssid, const string& bssid, const string& mode) {
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
825608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu        &control_interface_, nullptr, ssid, bssid, mode, 0, 0);
8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
8282b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      vector<uint8_t> ssid, const std::string& security) {
8293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
8303c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
8313c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
8323c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
8333c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
836f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kModeManaged,
8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string& security) {
8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
843fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string MakeNewEndpointAndService(int16_t signal_strength,
844fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   uint16_t frequency,
845fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   const char* mode,
846fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   WiFiEndpointRefPtr* endpoint_ptr,
847fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                   MockWiFiServiceRefPtr* service_ptr) {
8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
849fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string path;
8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8563c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
8583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
8603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
867fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string AddEndpointToService(
8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
8707fab89734d88724a288e96a9996b15548c5294c7Ben Chan      uint16_t frequency,
8712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const char* mode,
8722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr) {
8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
874fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string path;
8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8793c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8803c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
8870951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->ConnectTo(service.get());
8883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
8900951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFrom(service.get());
8913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
892d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  void InitiateDisconnectIfActive(WiFiServiceRefPtr service) {
8930951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFromIfActive(service.get());
894d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  }
8953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
896fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      const string& network_path,
8972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr,
898fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      string* bss_path_ptr) {
8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
9003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
901fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string bss_path(MakeNewEndpointAndService(
9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
903a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    if (!network_path.empty()) {
904a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
905fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _))
906fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          .WillOnce(DoAll(SetArgumentPointee<1>(network_path), Return(true)));
9078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(),
9088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu                  SetHT40Enable(network_path, true));
909a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
910a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
9113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
9130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9143c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
9153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9163c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9233c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
925fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      const string& network_path,
9262b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      WiFiEndpointRefPtr* endpoint_ptr,
927fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      string* bss_path_ptr) {
9283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
929fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string bss_path;
9303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
9313c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
9323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
9393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
9403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
9410951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9423c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
944bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
9458e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu    EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
9468e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu        .Times(AnyNumber());
9473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
948a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
9490654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
9500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9513c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
9533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
955d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
956b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
957b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
958b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
9592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
9602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
9610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kFullScan, nullptr, __func__);
9622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
9630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kProgressiveScan, nullptr, __func__);
9642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
965c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
9662b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFiServiceRefPtr& GetCurrentService() {
9671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
9681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
9692b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr& service) {
970bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
971bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
9722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& GetEndpointMap() {
973165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9752b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFiServiceRefPtr& GetPendingService() {
9761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
9771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
9782b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetPendingTimeout() {
9792b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
9802b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
9812b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetReconnectTimeoutCallback() {
982446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
983446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
9842b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const ServiceRefPtr& GetSelectedService() {
9852ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal    return wifi_->selected_service();
9862ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  }
9872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const string& GetSupplicantBSS() {
9887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
9897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
9902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetSupplicantBSS(const string& bss) {
9917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
9927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
9931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
9941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
9951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
9962b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& GetScanTimer() {
997b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
998b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
9993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
1000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
10013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
10022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  SupplicantProcessProxyInterface* GetSupplicantProcessProxy() {
10033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
10043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxyFromWiFi() {
1006fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko    return static_cast<MockSupplicantInterfaceProxy*>(
10078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
10083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
10103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
10113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
10123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
10132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantInterfaceProxy* GetSupplicantInterfaceProxy() {
10142b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    MockSupplicantInterfaceProxy* proxy = GetSupplicantInterfaceProxyFromWiFi();
10153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
10163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
10172b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const string& GetSupplicantState() {
10187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
10197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
10201caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int GetSupplicantDisconnectReason() {
10211caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein    return wifi_->supplicant_disconnect_reason_;
10221caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  }
10232b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ClearCachedCredentials(const WiFiService* service) {
1024835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
1025835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
10262b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr& endpoint) {
10270427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
10280427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
1029fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bool RemoveNetwork(const string& network) {
1030381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
1031381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
1032fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore CreateBSSProperties(const string& ssid,
1033fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    const string& bssid,
1034fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    int16_t signal_strength,
1035fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    uint16_t frequency,
1036fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                    const char* mode);
1037fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void RemoveBSS(const string& bss_path);
1038fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void ReportBSS(const string& bss_path,
10392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const string& ssid,
10402b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const string& bssid,
10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
10427fab89734d88724a288e96a9996b15548c5294c7Ben Chan                 uint16_t frequency,
10432b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                 const char* mode);
1044c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
10453c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, true);
10463c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  }
10473c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  void ReportIPConfigCompleteGatewayArpReceived() {
10483c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, false);
1049c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
1050050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1051050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // Calls the delayed version of the BSS methods.
1052fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void BSSAdded(const string& bss_path,
1053fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                const KeyValueStore& properties) {
1054050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSAdded(bss_path, properties);
1055050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1056fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void BSSRemoved(const string& bss_path) {
1057050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSRemoved(bss_path);
1058050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1059050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1060787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void ReportIPv6ConfigComplete() {
1061787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnIPv6ConfigUpdated();
1062787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1063f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
1064f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
1065f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1066f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
1067f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
1068f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1069f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
1070f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
1071f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
10722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ScanDone(const bool& success) {
10733cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanDone(success);
10743cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10753cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  void ReportScanFailed() {
10763cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanFailedTask();
10773cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
10795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
10805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
10815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
10825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
10835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
10845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
10855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
1086dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
10873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10882b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportCurrentBSSChanged(const string& new_bss) {
10891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
10901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
10912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportStateChanged(const string& new_state) {
10927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
10937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
10941caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  void ReportDisconnectReasonChanged(int reason) {
10951caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein    wifi_->DisconnectReasonChanged(reason);
10961caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  }
10975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
10985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
10995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
11007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
11017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
11027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
11032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message& nl80211_message) {
11047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
11057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
1106baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
11070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetLinkStatistics(nullptr);
1108baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
11092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetPendingService(const WiFiServiceRefPtr& service) {
1110df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
1111cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
111211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
11132b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const WiFiServiceRefPtr& service, const string& rpcid) {
111411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
111511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
11163fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  bool RpcIdByServiceIsEmpty() {
11173fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    return wifi_->rpcid_by_service_.empty();
11183fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetScanInterval(uint16_t interval_seconds, Error* error) {
1120bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
1121b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
1122e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
11230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetScanInterval(nullptr);
1124e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
11252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
1126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
1135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
1138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
11395412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _));
1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
11412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
11420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(true);  // Start(nullptr, ResultCallback());
1143125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
1144e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu      // Mimic the callback from |supplicant_process_proxy_|.
1145e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu      wifi_->OnSupplicantAppear();
11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
11472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
11492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11502f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
1151787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    EXPECT_CALL(*wake_on_wifi_, OnAfterResume());
11522f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
11532f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
11542f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
1155fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    ResultCallback callback(
1156fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1157fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->OnBeforeSuspend(callback);
11582f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
1159787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void OnDarkResume() {
1160787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    ResultCallback callback(
1161787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1162787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnDarkResume(callback);
1163787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
11643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  void RemoveSupplicantNetworks() {
11653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    wifi_->RemoveSupplicantNetworks();
11663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  void InitiateScan(Device::ScanType scan_type) {
11685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScan(scan_type);
11693fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11702b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void InitiateScanInDarkResume(const WiFi::FreqSet& freqs) {
11715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScanInDarkResume(freqs);
1172381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  }
11732b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void TriggerPassiveScan(const WiFi::FreqSet& freqs) {
11745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->TriggerPassiveScan(freqs);
11753fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
1177e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    wifi_->OnSupplicantAppear();
11782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
11792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
1181e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu    wifi_->OnSupplicantVanish();
11822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
11832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
11852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
11862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
1187687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
1188687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
1189687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
11902b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetIPConfig(const IPConfigRefPtr& ipconfig) {
1191687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
1192687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
11932b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanMethod(const string& method) {
1194fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    Error error;
1195fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    return wifi_->mutable_store()->SetAnyProperty(kBgscanMethodProperty,
119603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko                                                  brillo::Any(method),
1197fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                                  &error);
11984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
11994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
12002b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void AppendBgscan(WiFiService* service,
1201fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    KeyValueStore* service_params) {
12024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
12034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
12044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1205fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  void ReportCertification(const KeyValueStore& properties) {
1206bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
1207bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
120810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
12092b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void ReportEAPEvent(const string& status, const string& parameter) {
1210db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
1211db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
1212db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
1213e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
1214e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
1215e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
1216e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
12172d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void SetFastScansRemaining(int num) {
12182d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->fast_scans_remaining_ = num;
12192d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
12202d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
12211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
12221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
12231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
12261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
12271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetLinkMonitor(LinkMonitor* link_monitor) {
12303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
12313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12323c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
12332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr& service,
12342b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                          Service::ConnectFailure* failure) {
12351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
12361369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
12371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
12383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
12393c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
12403c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12413c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
12428e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  void OnUnreliableLink() {
12438e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu    wifi_->OnUnreliableLink();
12448e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  }
12458e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
12462b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanShortInterval(const uint16_t& interval, Error* error) {
1247bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
1248bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1249bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12502b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool SetBgscanSignalThreshold(const int32_t& threshold, Error* error) {
1251bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
1252bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1253bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12542b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void SetTDLSManager(TDLSManager* tdls_manager) {
1255618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu    wifi_->tdls_manager_.reset(tdls_manager);
1256df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1257df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
12582b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void TDLSDiscoverResponse(const string& peer_address) {
1259618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu    wifi_->TDLSDiscoverResponse(peer_address);
1260df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1261df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1262618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  string PerformTDLSOperation(
12632b363903f38a515001c5edc7202403fcddb15a01Paul Stewart      const string& operation, const string& peer, Error* error) {
1264c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
1265c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
1266c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
1267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
1268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
1269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
1270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
12712b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnNewWiphy(const Nl80211Message& new_wiphy_message) {
12723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
12733946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
12743946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
1275787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  bool IsConnectedToCurrentService() {
1276787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    return wifi_->IsConnectedToCurrentService();
1277787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1278787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
12792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  NiceMockControl* control_interface() {
128010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
128110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
128210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
12832b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMetrics* metrics() {
128485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
128585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
128685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
12872b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockManager* manager() {
12883239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
12893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
1290d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
12912b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockDeviceInfo* device_info() {
1292d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
1293d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1294d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
12952b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockDHCPProvider* dhcp_provider() {
1296d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
1297d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1298d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
12993239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
13003239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
13013239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
13023239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
13032b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWiFiProvider* wifi_provider() {
13043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
13063c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13072b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMac80211Monitor* mac80211_monitor() {
13083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
13093946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
13103946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
13111964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  void ReportConnectedToServiceAfterWake() {
13121964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan    wifi_->ReportConnectedToServiceAfterWake();
13131964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  }
13141964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
13152d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void StartScanTimer() {
13162d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->StartScanTimer();
13172d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
13182d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
13192b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  bool ParseWiphyIndex(const Nl80211Message& nl80211_message) {
1320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return wifi_->ParseWiphyIndex(nl80211_message);
1321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; }
1324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1325d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; }
1326d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
13272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  std::set<uint16_t>* GetAllScanFrequencies() {
1328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return &wifi_->all_scan_frequencies_;
1329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
13312b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  void OnScanStarted(const NetlinkMessage& netlink_message) {
1332d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    wifi_->OnScanStarted(netlink_message);
1333d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  }
1334d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
13353cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  bool ScanFailedCallbackIsCancelled() {
13363cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    return wifi_->scan_failed_callback_.IsCancelled();
13373cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
13383cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
133914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  void SetWiFiEnabled(bool enabled) {
134014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan    wifi_->enabled_ = enabled;
134114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  }
134214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
13432b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MOCK_METHOD1(SuspendCallback, void(const Error& error));
1344fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
13452b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  EventDispatcher* event_dispatcher_;
13462b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockScanSession* scan_session_;  // Owned by |wifi_|.
13472b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockWakeOnWiFi* wake_on_wifi_;  // Owned by |wifi_|.
13485c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
13495c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
13503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1352dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
13533426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
13542ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
1355c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
13563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
13573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
13583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
13592b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockMac80211Monitor* mac80211_monitor_;  // Owned by |wifi_|.
13603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
13623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
13633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
1365626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
13663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
1368446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
1369446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
13707fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1372e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  MockSupplicantProcessProxy* supplicant_process_proxy_;
1373ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
1374f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
1375f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
1376735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
1377735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
1378735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
13792b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  DeviceMockAdaptor* adaptor_;
13802b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantEAPStateHandler* eap_state_handler_;
1381bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
13823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1384ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1385fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  unique_ptr<MockSupplicantNetworkProxy> supplicant_network_proxy_;
13863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1388e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1389e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1390e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1391e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1392446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1393446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
13947fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
13953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1396fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::RemoveBSS(const string& bss_path) {
1397b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1398261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1399261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1400fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuKeyValueStore WiFiObjectTest::CreateBSSProperties(
14012b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const string& ssid,
14022b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const string& bssid,
1403050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    int16_t signal_strength,
1404050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    uint16_t frequency,
14052b363903f38a515001c5edc7202403fcddb15a01Paul Stewart    const char* mode) {
1406fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore bss_properties;
1407fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetUint8s("SSID", vector<uint8_t>(ssid.begin(), ssid.end()));
14083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
14093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
14103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1411a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
14123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
1413fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    bss_properties.SetUint8s("BSSID", bssid_bytes);
14143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1415fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetInt16(WPASupplicant::kBSSPropertySignal, signal_strength);
1416fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetUint16(WPASupplicant::kBSSPropertyFrequency, frequency);
1417fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  bss_properties.SetString(WPASupplicant::kBSSPropertyMode, mode);
1418050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1419050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  return bss_properties;
1420050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
1421050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1422fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiuvoid WiFiObjectTest::ReportBSS(const string& bss_path,
1423fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const string& ssid,
1424fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const string& bssid,
1425fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               int16_t signal_strength,
1426fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               uint16_t frequency,
1427fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                               const char* mode) {
1428050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  wifi_->BSSAddedTask(
1429050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      bss_path,
1430050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode));
14313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
14323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1433e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1434e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1435e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1436e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1437e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1438e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1439a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1440a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1441a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1442a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1444a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1445a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
14469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
14479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
14489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
14499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1451f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1452a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
14542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
14552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
14569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
14579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
14589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
14599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
14609f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
14622b363903f38a515001c5edc7202403fcddb15a01Paul Stewart                                          WiFiEndpointRefPtr* endpoint,
1463fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                                          string* bss_path) {
14649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
14659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
14669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
14679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1469fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string dummy_bss_path;
14709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
14719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
14729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1474a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1475a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
1477fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        SetupConnectingService("", endpoint, bss_path);
14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
14809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
14819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
14839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
14849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1486a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
14872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1488a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1489a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1492a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
14932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1494f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1495a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1496a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1497a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1498a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1499a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1500a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1501a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1502f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1503a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1504a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1506a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1507a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1508a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1509a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1510a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1511a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1512a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1517a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1519a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1520a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1521a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1522a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1523a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1524a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1526e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EventDispatcherForTest dispatcher_;
1527e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1528e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
15293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
15300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
15313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
15330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
15353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15362b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
15372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
15382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
15392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1540227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1541227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1542227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1543227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1544227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1545227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1546227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1547227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1548227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1549227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1550227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1551227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1552227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1553227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1554227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1555227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1556227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1557e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan
1558e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  // Do not set supplicant's roam threshold property immediately if the
1559e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  // current WiFi service has its own roam threshold property set.
1560e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1561e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  service->roam_threshold_db_set_ = true;
1562e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  SetCurrentService(service);
1563e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(_)).Times(0);
1564e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1565e20e8da79eb81ecf8cafd18b37bb40cbc8c84534Samuel Tan  EXPECT_EQ(kRoamThreshold16, GetRoamThreshold());
1566227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1567227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
15682b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
1569e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
15702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
15712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
1572e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
15732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1574227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1575227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1578227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1579227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1580227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1581227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
15822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
1583e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15849cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
15859cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
15869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
15879cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
15889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
15899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
15902b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
15912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
15922b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
1593e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
15952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
1596e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15979cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
15989cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
15999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
16009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
16022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16042b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
1605e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
16062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
1608e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
16092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
16122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
16132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16162b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
16172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1623549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
1627fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr));
1628549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1629549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1630c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1631549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1632549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1633549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
1634ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1640549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1641549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
16420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1643549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1644549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
16455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
16465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1647fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _));
1648fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _))
16493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
1650fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1651b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
16523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
16543239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1655b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
16563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
1659fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _));
1660fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _))
16615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
1662fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
16635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
16645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
16685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1670835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1672fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
16730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
16750951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  ClearCachedCredentials(service.get());
1676835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1677835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
16780427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
16790427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
16800427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
16810427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
16820427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
16830427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
16840427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1685381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1686fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
1687381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1689fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(true));
1690381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1691381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1692381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1693ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1694316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1695316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1696316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1697316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
169815d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, true, _))
1699316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
17002b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
1701316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1702316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1703316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1704316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1705316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1706316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1707316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
170815d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, true, _))
1709ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
17102b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
17110951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
1712316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1713316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1714316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1715316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
171615d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kDeviceName, _, false, _))
1717316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
17182b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const_cast<WiFi*>(wifi().get())->AcquireIPConfig();
1719ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1720ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1721fc5236388674c3ae04255d98f5a3e93b789be185Peter QiuTEST_F(WiFiMainTest, RemoveNetworkFailed) {
1722fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string network = "/test/path";
17233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1724fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1725381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1726381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1727381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1728381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
17295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
17305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1731fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _))
17323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
1733fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
1734fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_, _));
17353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
17363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17373239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
17405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
1741fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_, _))
17425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
1743fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
17445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
17503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
17513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
17523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
17555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
17562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
17572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
17583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
17612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1762f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
17632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
17642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
17652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1767c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1769c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1770c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17710951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
17722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
17742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
17752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
17762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
17772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
17782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
17792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
17802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1781c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1782c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
17842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1785c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
17862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
17872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
17880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1789c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1791c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1793c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1794c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17950951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
17962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1797c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
17982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
17992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
18002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
18012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1802c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1803c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18040951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1809c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1810c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
18115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
18132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
18142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1816f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
18172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
18192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
18215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18240951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
18282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
18292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
18332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
18352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
18412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
18430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
18445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
18455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
18542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
18555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
18562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18633cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) {
18643cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  StartScan(WiFi::kScanMethodFull);
18653cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ExpectScanStop();
18663cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
18673cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ReportScanFailed();
18683cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18693cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
18703cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
18715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
18725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
18733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1874ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1875ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
18763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18775c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1878ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1879ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
18802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1881ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1882ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1883ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
18845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
18855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
18865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
18875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
18905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
18915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
18930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
18940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
18950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
18965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18993a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) {
19003a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  StartWiFi();
19013a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19023a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19033a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ReportScanDone();
19043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  CancelScanTimer();
19053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
19063a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ASSERT_TRUE(wifi()->IsIdle());
19073a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19083a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  OnAfterResume();
19093fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(GetScanTimer().IsCancelled());
19103a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  InstallMockScanSession();
19113a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  SetCurrentService(MakeMockService(kSecurityNone));
19123a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19133a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19143a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan}
19153a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan
19165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1919ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1920ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1922ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1923ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19242f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1925ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1926ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1927ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
19345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
19375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
19415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1943ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1944ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
1947fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
19483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
19493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
19503ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1952ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19532f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1954ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1955ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1956ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
19585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
1963fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
19645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
19655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
19665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
19685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1969df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
19705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
19715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19748e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) {
19758e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
1976fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
19778e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
19788e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1);
19798e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnAfterResume();
19808e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19818e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
19828e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
19833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
19843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
19853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1986e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
19873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1988e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
19893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1990e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
19913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1992e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
19937fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
1994e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1995e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1996e41a72d0737488d561a4158019409d5785dad61bThieu Le
19972b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap();
1998e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1999e41a72d0737488d561a4158019409d5785dad61bThieu Le
2000e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
2001e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
2002e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
2003e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
2004e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
2005e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
2006e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
2007e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
2008e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
2009e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
2010e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
2011e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
20123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
20133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
20143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
20153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
20163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
20173c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
20183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
20193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
20203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
20213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
20223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
20243c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
20253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
20263c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
20273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
20283c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
2029381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  manager()->set_suppress_autoconnect(true);
20303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
2031381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
20323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
20333c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
2035b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
20360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
2037e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
2038b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
2039e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
2040e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
20418a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
20428a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
20438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
20448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2046fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2048fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, &bss_path));
2049ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
20548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2056261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
2057261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
2058261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
2059261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
20603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2061fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2063fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, &bss_path));
20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
20673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
20683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
20693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2070835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
2071835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
2072fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath = "/test/path";
20730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
2074835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2075835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2077835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
20783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20793c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
20810654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2082835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2083835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
2084a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
2085a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
2086fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).Times(0);
20873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
2088835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
2089835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
2090835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
20910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
20920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2094fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
20953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
20963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20974943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
20984943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
20994943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
21004943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
21014943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
21020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21034943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
21044943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21054943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
21064943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
21074943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
2108fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
21094943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
21104943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
21143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
21150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
21190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
2121fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
21230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
21283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
21300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
21313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
21353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
21363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
21390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
21410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
21420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
21440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21452b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
21460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
21493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2150fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
21510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
21523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21534943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
21540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
21550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
21570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
21580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
2159835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2160835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
2161ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
2162af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
2163608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  EXPECT_CALL(*control_interface(),
2164e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu              CreateSupplicantNetworkProxy(kPath))
2165af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
2166fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true));
2167735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
21683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
21694943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
21704943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21714943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
21720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
21734943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21744943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
21754943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21764943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
21774943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
2178fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
21790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
21804943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21814943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
21824943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21834943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
21844943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
21854943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
21864943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21874943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
2188ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
21894943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
2190608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  EXPECT_CALL(*control_interface(),
2191e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu              CreateSupplicantNetworkProxy(kPath))
21924943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
2193fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false)).WillOnce(Return(true));
21944943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
21954943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
21964943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
21974943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
21990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
22020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
2203c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
22043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2205fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
22060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
2208fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(false));
22093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2210c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
2211c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
2212c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
2213c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
22140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
2216c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
2217c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
22180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
22190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
2220fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
22210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2222fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService("",
22230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
22240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
22270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
22280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
22290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22312b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
22324943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22334943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
22344943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
22354943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22362b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
22372b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
22381aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
22391aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
2240fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
22410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22421aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22431aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
22441aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
22451aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
22461aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22471aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22481aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
22491aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
22501aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22511aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
22521aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
22530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
22551aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22561aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
22571aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22581aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
22591aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
2260d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
2261d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2262fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
22630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2264d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2265d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2266d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
22676f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log, Log(_, _, ContainsRegex("DisconnectFromIfActive.*service")))
22686f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(1);
22696f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log,
22706f99f2cb25bead57398151880118a7794d5428a3Samuel Tan              Log(_, _, ContainsRegex("DisconnectFrom[^a-zA-Z].*service")))
22716f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(1);
2272d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
2273d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2274d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2275d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
22760951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2277d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2278d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2279d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2280d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2281d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
2282d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2283fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
22840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2285d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2286fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service1(SetupConnectedService("",
22870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2288d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2289d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2290d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
22916f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log, Log(_, _, ContainsRegex("DisconnectFromIfActive.*service")))
22926f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(1);
2293d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
2294d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
2295d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
22966f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                       ContainsRegex("In .*DisconnectFrom\\(.*\\):")))
22976f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(0);
2298d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2299d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2300d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2302d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2303d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2304d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2305d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2306d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2308fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService("",
23090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
23100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
2312d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2313d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2314d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
23156f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log, Log(_, _, ContainsRegex("DisconnectFromIfActive.*service")))
23166f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(1);
2317d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
23186f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log,
23196f99f2cb25bead57398151880118a7794d5428a3Samuel Tan              Log(_, _, ContainsRegex("DisconnectFrom[^a-zA-Z].*service")))
23206f99f2cb25bead57398151880118a7794d5428a3Samuel Tan      .Times(1);
2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
23226f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                       ContainsRegex("In .*DisconnectFrom\\(.*\\):"))).Times(1);
2323d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23260951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2328d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2329d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2330d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
233117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
23329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
23332b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& pending_timeout = GetPendingTimeout();
233417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
23359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
23369f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
233744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
233844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
233917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
234017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
234117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
23426f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(*service,
23436f99f2cb25bead57398151880118a7794d5428a3Samuel Tan              DisconnectWithFailure(Service::kFailureOutOfRange, _,
23446f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                    HasSubstr("PendingTimeoutHandler")))
234517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
234617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
234717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
234833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
234917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
23500cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
235144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
2352a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
235344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
2354a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
2355a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2356a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
23570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
23580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
23590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
236017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
23610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
236233a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
236333a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
23640951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
23650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
23660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
23670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
236817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
236917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
237017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
23712b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
23722b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const base::CancelableClosure& pending_timeout = GetPendingTimeout();
23732b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
23743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2375fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
23762b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
23772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
237817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
237917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
23800d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
23810d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
23826f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                              HasSubstr("PendingTimeoutHandler")));
238317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
238417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
238517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
238617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
23873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
23880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
23890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
23900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
23910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
23920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
23933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
23940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
23960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
23970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
23980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
23990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
24003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
2401fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
24020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
24033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
2404fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillRepeatedly(Return(false));
24053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
24060ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
24070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2411c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
24123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
2413fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string kPath("/fake/path");
24140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
24153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
24160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
24173c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
24190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
24210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2423c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2424b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2425c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
24265c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
24275c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2428549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
24293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
2432fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr));
2433ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
24343c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
24353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
24363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
24373c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
24383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2439549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
24400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2441549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2442549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2443446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
24443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2446fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
24473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
24481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24490654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
24510654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
24521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24530654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2455446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
24561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
24621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2463446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2464446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
2465fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu
24665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2467fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  if (!arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs)) {
2468ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2469ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2470ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2471fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  ByteArrays ssids = arg.GetByteArrays(WPASupplicant::kPropertyScanSSIDs);
2472ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2473ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2474ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2475ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
24763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
24773c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
24783c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
2480fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  return !arg.ContainsByteArrays(WPASupplicant::kPropertyScanSSIDs);
2481ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2482ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
24835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
24845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
24853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
24863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
24873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
24883c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
24915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
24925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
24933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
24943c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
24953c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
24975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
24985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
24995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
25045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
25055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
25065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2508ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25105412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
25115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
25155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
25195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
25205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
25245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
25255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
25265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25313c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25345412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2535ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2536ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2537ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2538fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2539fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2540fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2541fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2542fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
25445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2545fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2546fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2547fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
2548fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2549fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2550fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2551fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
25521e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
25531e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
25541e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
25551e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
25561e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
25571e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
2558fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(false));
25591e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
25601e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
25611e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
25621e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
25631e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
25645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
25655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
25665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
25675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
25685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
25709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
25717de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
25725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
25735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
25752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
25765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
25785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
25795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2581f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2582df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2583df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2584df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2585f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
25865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
25875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
25895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
25905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
25915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
25925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
25955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
25985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
25995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
26005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
26015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
260244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
260344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
260444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
260544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
26065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
26079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
26085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
26112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
26127de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
26185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
26195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
26205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
26215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
26225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
26235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
26250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
26265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2629a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2630a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
26315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
26330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
26370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
26392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
26402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
26412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
26425412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
26432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
26445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
26462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
26485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
26490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
26520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
26532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
26540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
26552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
26560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
26607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
26617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
26627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
26637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
26647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
26650654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
26660654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
26677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
26687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
26697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
26707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
26717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
26727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2673f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
26747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
26757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
26760654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
26777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
26787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
26797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2680d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
26817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
26827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
26837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
26847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
26857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
26868e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
26878e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu      .Times(AnyNumber());
2688d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
26897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
26907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2691f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2692bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2693bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2694bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
26957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
26960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
26970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
26980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
26997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
27007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
27017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
27020951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
27033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
27047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2706a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
2707e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_;
2708a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2709a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2710f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2711fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
2712a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2713a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2714a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2715a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2716a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2717a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2718a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2719a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2720a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2721a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2722a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2723e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_;
2724a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2725a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2726f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2727fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
2728fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
2729fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
2730fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
27310654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2732a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2733a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2734a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2735a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2736a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2737a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2739a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2740a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2741a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
27422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2743fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
2744fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
2745fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
2746fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
27470654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2748a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
27490654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2750a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2751a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27521590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
27531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
27543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
27553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
2756fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", &endpoint, nullptr);
27571590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
27584943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
27590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
27600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
27610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2762687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
27631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
27641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
27651590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
27661590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
27673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
2768fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
27693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
2770fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path1(MakeNewEndpointAndService(
27710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
27723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
27731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2774c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2775c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2776c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2777c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
27783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
27793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
27803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2781bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2782a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
27830654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
27843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2785687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
27860951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
27870951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
27881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
27891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2790e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2791e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
27920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
27930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
27940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
27953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
2796fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
27973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
2798fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path =
27993c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
28003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
28013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2802687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
28030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2804687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2805687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2806687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2807687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2808687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2809687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2810687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2811687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2812687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
28130951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(ipconfig.get());
2814687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28154eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
28164eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
28171caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonUpdated) {
28181caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ScopedMockLog log;
28191caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason = 4;
28201caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason_second = 0;
28211caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _))
28221caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein      .Times(AnyNumber());
28231caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), WiFi::kDefaultDisconnectReason);
28241caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(log,
28251caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein              Log(logging::LOG_INFO, _, EndsWith(" DisconnectReason to 4")));
28261caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason);
28271caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason);
28281caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_CALL(log,
28291caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein              Log(logging::LOG_INFO, _, EndsWith("Reason to 0 (was 4)")));
28301caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason_second);
28311caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(GetSupplicantDisconnectReason(), test_reason_second);
28321caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein}
28331caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein
28341caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectReasonCleared) {
28351caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  int test_reason = 4;
28361caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // Clearing the value for supplicant_disconnect_reason_ is done prior to any
28371caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // early exits in the WiFi::StateChanged method.  This allows the value to be
28381caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  // checked without a mock pending or current service.
28391caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportDisconnectReasonChanged(test_reason);
28401caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_, test_reason);
28411caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
28421caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
28431caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein  EXPECT_EQ(wifi().get()->supplicant_disconnect_reason_,
28441caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein            WiFi::kDefaultDisconnectReason);
28451caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein}
28461caa576e76930d7cef6f4b0fc79b280d23cb9855Rebecca Silberstein
28478a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
28488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
28493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
2850fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
28513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
28528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
28533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
2854fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
28553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
28560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
28578a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
28588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
285949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
286049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
2861fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
286249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
286349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
2864fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, &bss_path));
286549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
2866fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
286749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
286849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
286949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
287049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
287149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
287249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
287349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
287449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
287549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
28760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
28770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
287849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
287949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
288049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
28818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
28828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
28838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
28843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2885fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
28868a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
28878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
28888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
28894a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
2890fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  return arg.ContainsUint(WPASupplicant::kNetworkPropertyScanSSID) &&
2891fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      arg.ContainsUint(WPASupplicant::kNetworkPropertyDisableVHT) &&
2892fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      arg.ContainsString(WPASupplicant::kNetworkPropertyBgscan) == bgscan;
28934d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
28944d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
28954d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
28964d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
28973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
28980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2899a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
2900fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2901fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu              AddNetwork(WiFiAddedArgs(true), _));
29020654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
29034d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
29044d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
29054d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
29064a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
29074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
29083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
29090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2910a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
2911fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2912fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu              AddNetwork(WiFiAddedArgs(false), _));
29134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
29144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
29164a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
29174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2918f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
29194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
2921fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
29230951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29240951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
2925fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
29264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
2929fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
29310951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29320951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
2934fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
2935fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    config_string = params.GetString(WPASupplicant::kNetworkPropertyBgscan);
29363a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    vector<string> elements = base::SplitString(
29373a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        config_string, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
29384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
29404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
29450654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
2946fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29480951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29490951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
2950fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_TRUE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
2951fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    string config_string =
2952fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu        params.GetString(WPASupplicant::kNetworkPropertyBgscan);
29533a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    vector<string> elements = base::SplitString(
29543a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        config_string, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
29554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
29574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29595c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
29605c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
29610654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
2962fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    KeyValueStore params;
29633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29645c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
29650951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29665c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
2967fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu    EXPECT_FALSE(params.ContainsString(WPASupplicant::kNetworkPropertyBgscan));
29685c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
29694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2971c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2972c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
29733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2974fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
2975c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2976c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2977c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2978c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2979c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2980c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
29810951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
2982c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2983c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2984c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2985c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
29863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
2987fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr));
29888f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2989c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
29908f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
29918f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
29920654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
29935519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
29943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
29953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
29963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
29978f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
29988f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
29995519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
30005519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
30013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
30023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
30033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
30040654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3005c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
3006c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3007b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
3008b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
3009b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
3010b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
3011b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
3012e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  EXPECT_CALL(*control_interface(), CreateSupplicantBSSProxy(_, _));
3013b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
3014b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
3015b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3016b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
3017b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
3018b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
3019b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
3020b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
30212b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockSupplicantBSSProxy* proxy = supplicant_bss_proxy_.get();
3022b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
3023b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
3024fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path(
30250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
30260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
30273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
3028b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
3029b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
3030b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
3031b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3032b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
30335c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
30345c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
30355c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
30365c05b2920be742d518829972127172481722058dmukesh agrawal
30375c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
30385c05b2920be742d518829972127172481722058dmukesh agrawal
30395c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
30405c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
30415c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
30423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
30435c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
30442f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
30455c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
30465c05b2920be742d518829972127172481722058dmukesh agrawal}
30475c05b2920be742d518829972127172481722058dmukesh agrawal
3048402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) {
3049402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  StartWiFi();
3050402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
30514b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto-
30524b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // connectable services.
3053402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3054402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
3055402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30564b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _));
3057402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3058402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3059402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If we have 1 or more auto-connectable services, do not call
3060402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3061402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3062402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(1));
3063402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30644b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3065402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3066402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3067402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3068402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If the WiFi device is not Idle, do not call
3069402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3070402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  SetCurrentService(MakeMockService(kSecurityWep));
3071402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_FALSE(wifi()->IsIdle());
3072402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3073402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
30744b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3075402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3077402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan}
3078402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
30795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
30805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
3081b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3082b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3083b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3084b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3085b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3086b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
30877de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
30880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3089b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
3090b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3091b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3092b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3093b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3094b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
30955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
30965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
30975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
30985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
30995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
31005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
31010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3102df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
31035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
31045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
31055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
31075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
31085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3113b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3114b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3115b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
3116b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
3117b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
3119b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3120b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3121b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3122b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3123b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3124b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
3125b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3126b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
31273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
3128fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr);
3129b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3130b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3131b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3132b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
3134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3137b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) {
31402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EnableFullScan();
31412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartWiFi();
31422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31432d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  ReportScanDone();
31442d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  CancelScanTimer();
31452d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
31462d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
31472d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
31482d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31492d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true));
31502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  FireScanTimer();
31522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());  // Do not re-arm.
31542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
31552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3158b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3159b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3160b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
3162b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3163b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3164b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3165b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
3166b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3167b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3168b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3169b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3170b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3171b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3172b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3173b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3174b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
3175b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3176b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3177b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
3179b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3180b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
31835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
31845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
31855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
3186fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
31875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
31885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
31895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
3190a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
31915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
31925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
31935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
31945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
31955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
31965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
31985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3201b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
32025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
3203fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
3204df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
32053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
32063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
32073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
3208a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
32093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
32115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
32120654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3213b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3214b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3215b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3216b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
3217b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3218b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3219fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
3220b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
3221df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
32223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32233c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
32240654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3225b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
32293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
32302ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
32312ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
32323c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
32332ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
32343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
32353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
32363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
32372ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32382ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
32392ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
32403c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
32413c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
3242daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32442ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32452ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32462ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
32472ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
32482ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
32492ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
32502ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32512ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
32522ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32532ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32542ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
3255a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3256a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  SetCurrentService(service);
32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
32583c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3259daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
3260fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach())
3261fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(Return(true));
32623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3264a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu
3265a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  // Service is unreliable, skip reassociate attempt.
3266a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  service->set_unreliable(true);
3267a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3268a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu                       EndsWith("skipping reassociate attempt."))).Times(1);
3269a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
3270a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  OnLinkMonitorFailure();
3271a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
32733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
32748e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) {
32758e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
3276fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
32778e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
32788e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1);
32798e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnUnreliableLink();
32808e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32818e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
32828e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
3283cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
3284f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3285bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
32860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
3287cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3288cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3289bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
3290f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
32910654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3292bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3293bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
3294bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
32950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
32961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3297bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
32981369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
3299cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3300cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3301f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
3302f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
3303f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
3304f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
3305a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3306f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
3307f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
3308f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3309f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
3310f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
3311f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
3312f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
3313f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
33148e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu  EXPECT_CALL(*dhcp_provider(), CreateIPv4Config(_, _, _, _))
33158e0151e84f077cc9c0646d5bafd925ed235a1c12Peter Qiu      .Times(AnyNumber());
3316f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
3317f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3318f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3319f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3320f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3321f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3322f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
33230951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3324f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3325f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
3326f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3330f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3331f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
3332f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
33380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33390d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33406f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                              HasSubstr("OnIPConfigFailure")));
3341f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33420951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3347f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
33480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33490d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33506f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                              HasSubstr("OnIPConfigFailure")));
3351f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33520951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
3355f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
3356f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3357f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
3358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
33590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
33600d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
33616f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                    HasSubstr("OnIPConfigFailure")));
3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
3364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
33651369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
3366f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3367735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3368735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3369735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
3370735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3371735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3372bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3375bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3376bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
33771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3378bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
33791369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
33800951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3381bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3382bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33840951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3385bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3386bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3387bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
33880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33891369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
33901369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
33911369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
3392f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
3393cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
33940654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3395cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3396a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3397bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3398f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
33994943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3400735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3401cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3402f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
34030654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
34041369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
34051369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
34061369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
3407f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
34081369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
34091369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
3410735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3411735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
34124943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3413735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
3414735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
3415735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
3416735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3417735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3418bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3419735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
34201369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
342139a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
3422735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
34230654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3424cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3425cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
34261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) {
34271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
34281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan              ReportConnectedToServiceAfterWake(IsConnectedToCurrentService()));
34291964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  ReportConnectedToServiceAfterWake();
34301964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
34311964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
3432e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
3433e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
34341aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
3435e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
34361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
3437e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3438e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
3439e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
3440e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3441e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
3442e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
3443e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34441aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
3445e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
3446e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
3447e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
3448e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3449e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
3450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
3451e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
3452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
3453e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
3454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
3455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
3456e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
3457e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
3458e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
34613a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        .Times(WiFi::kNumFastScanAttempts - 1);
3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
34663a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1);
3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34741aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
347566bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer.
347666bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
34770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
3478e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
34813a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko      _, WiFi::kFastScanIntervalSeconds * 1000));
3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
34883a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko      _, WiFi::kFastScanIntervalSeconds * 1000));
3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34941aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
34951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
34961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
34973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
3498fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
34991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
35061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
35121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
35201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
35221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35237cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
35247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
35257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
35287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
35297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
3530fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectedService("", nullptr, nullptr);
35317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
35327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35345412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
35357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
35367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
35377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
35397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
35417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
35447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
35457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
35467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
35507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
35517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
35527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
35537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
35615412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
35647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
35707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3571baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3572baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3573baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3574baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
35757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
35767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
35777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
35827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3586baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3588baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3589baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3590baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3591baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3592baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3593baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3594baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3595baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3596baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3597baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3598baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3599baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3600baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3601baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3602baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3603baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3604baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3605baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3606baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3607baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3608baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3609baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3610baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3611baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3612baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3613baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3614baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3615baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
36367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
36377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
36387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
36397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
36408e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
36417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
36427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
36437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3657baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3658baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3659baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3660baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3661baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3662baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3663baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3664baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3666baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3667baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3668baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3669baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3670baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3671e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3672e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3673e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3674e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3675e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3676e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3677e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3678e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3679e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3680e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3681e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3682e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3683e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3684e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3685e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3686e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3687e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3688e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3689e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3690e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3691e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3692e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3693e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3694e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3695e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3696e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3697e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3698e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3699e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3700e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3701e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
37088e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
37098e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3711e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3712e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
37167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
37177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
37181964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) {
37191964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
37201964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
37211964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  StartWiFi();
3722fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
37231964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(
37241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      mock_dispatcher_,
37251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds));
37261964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  OnAfterResume();
37271964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
37281964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
37292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) {
37302d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37312d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  // Return immediately if scan interval is 0.
37322d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(0, &e);
37332d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
37342d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37352d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37362d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37372d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) {
37382d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37392d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37402d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37412d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(1);
37422d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_,
37432d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan              PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000));
37442d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37452d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37462d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37472d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) {
37482d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37492d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(0);
37522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000));
37532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3756bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3757f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3758bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3759bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3760bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3761bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3762fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  KeyValueStore args;
3763bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3764bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3765bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3766bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3767bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3768bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3769bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3770bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
37717fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
3772fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  args.SetUint(WPASupplicant::kInterfacePropertyDepth, kDepth);
3773bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3774bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3775bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3776bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3777bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3778bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3779bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
3780fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  args.SetString(WPASupplicant::kInterfacePropertySubject, kSubject);
3781bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3782bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3783db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3784db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
37853cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) {
37863cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanFailedTask if scan failed.
37873cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
37883cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_,
37893cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan              PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds));
37903cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(false);
37913cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_FALSE(ScanFailedCallbackIsCancelled());
37923cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
37933cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed
37943cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // callback if has been dispatched.
37953cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_));
37963cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(true);
37973cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
37983cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
37993cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
3800db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
380111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3802db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3803db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3804735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3805735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3806735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3807735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3808db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3809db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3810db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3811f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3812db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3813735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3814db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3815735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
38160951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3817735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3818db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3819735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3820735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3821735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
38220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
38230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38246f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                              HasSubstr("EAPEventTask")));
3825735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
382611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
38272b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockEapCredentials* eap = new MockEapCredentials();
382811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
382911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
383011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
383111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
383211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
383311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
383411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
383511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
383611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
38370d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
38380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38396f99f2cb25bead57398151880118a7794d5428a3Samuel Tan                                              HasSubstr("EAPEventTask")));
384011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
384111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
384211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
384311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
384411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
384511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
384611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
384711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
38480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
384911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
385011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
385111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
385211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
385311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3854bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3855bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3856c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3857c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3858c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3859c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3860c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3861c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3862c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3863c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3864c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3865c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3866c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3867c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
38686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
38696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
38706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
38716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
38726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
38737fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
38746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
38756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
38766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
38776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
38786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
38796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
38806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
38816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
38826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
38836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
38846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
38856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
38866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
38876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
38886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
38896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
38906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
38916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
38926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
38936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
38946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
38956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
38966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
38976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
38986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
39036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
39047347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
39057347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39075581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
3908e5fe58dedad8d7fb509eb7eac82e77f8cc86ebc0Peter Qiu  MockSupplicantProcessProxy* process_proxy = supplicant_process_proxy_;
39095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
39115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
3912fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
39135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
39175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
3918fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3919fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3920fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
3921fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
39245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
39275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
3928fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3929fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3930fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)),
3931fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3932fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3933fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelError)),
3934fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3935fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3936fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3937fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelExcessive)),
3938fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3939fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3940fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3941fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelExcessive)),
3942fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3943fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3944fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3945fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelMsgDump)),
3946fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3947fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3948fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3949fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelMsgDump)),
3950fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3951fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3952fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3953fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelWarning)),
3954fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3955fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3956fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(
3957fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                    string(WPASupplicant::kDebugLevelWarning)),
3958fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
39715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
3972fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3973fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3974fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
3975fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39760654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
39775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
39785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
39825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
3983fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3984fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3985fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
3986fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
39870654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
39885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
39895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
3994fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_))
3995fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3996fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelDebug)),
3997fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)))
3998fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      .WillOnce(
3999fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu          DoAll(SetArgumentPointee<0>(string(WPASupplicant::kDebugLevelInfo)),
4000fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu                Return(true)));
40015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
40025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
40055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
4006fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*process_proxy, GetDebugLevel(_)).Times(0);
40075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
40085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
40095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
40125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
401350cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
401450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
401550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
401650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
401750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
4018bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
4019bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
4020bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
4021bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
4022bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4023bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40247fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
4025bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4026bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
4027bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4028bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4029bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
4030bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4031bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4032bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4033bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
4034bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4035bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40367fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
4037bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4038bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4039bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4040bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4041bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4042bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4043bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4044bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4045bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
4046bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4047bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
4048bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
4049bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4050bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4051bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
4052bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
40530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
40540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40550cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
40569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
40570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
4058a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4059a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4060a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4061a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4062a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
40657de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
40660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
40670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
40680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
40700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
40710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
40720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40730cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
40749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
40750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
4076fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
40779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
40789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
40799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
40800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4082a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
40830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4085a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4086a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
40890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
40900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
40910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
40930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
40940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
40950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40960cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
40979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
40980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
4099fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
41009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
41019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
41020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4104a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
41050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
41090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
41110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
41120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
41130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
41150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
41160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
41170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
4118df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
41199f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4120df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
41219f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
41229f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
4123df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
4125a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
4127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
41289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4129df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4130df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4131df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4132df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
4133df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
4134df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
4135df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
4136df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4137df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4138df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4139df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4140df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4141b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
4142b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4143b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
4144df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
4145b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
4146b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4147df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
4148df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
4150df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4152df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4153b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
4154b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
4155b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
4156b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4157df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
4158df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4159df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4160df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4162a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4165df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4166df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
4167df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4168df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
41700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
41729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4173df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4174df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
4175a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4176a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
4178fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4181df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
4182a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4183a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
41849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4185df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4186df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4187df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4188df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
4191fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", nullptr, nullptr));
4192df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4194df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
41950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
4196df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4197a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4198a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
42029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4203df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4204a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4205fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_, _)).
4206fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      WillOnce(Return(false));
4207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4210f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
4211f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4212a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
4213df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
4214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
4216df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
42190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
42200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
42210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
4222df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
42239f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
4226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
4227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4228a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4229f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4233df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
4234a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4235df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4236df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4237df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4238df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
4239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4242df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
4243df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
4244f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
4245a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
4246a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
42472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
4248df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
4249a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
4250a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4251a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4252a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
4254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
4255a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4257df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
4258a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4259df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4260df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
4261fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string bss_path;
4262a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4265df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4266df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
4267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
4269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
4270fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu      SetupConnectingService("", &endpoint, &bss_path);
4271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
4273a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
4274df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
4275df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
4276df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4277df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4278df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4279df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4280df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
42813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
42823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
4283fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  SetupConnectedService("", nullptr, nullptr);
42843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
42853bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
42872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
42883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
42893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
42903bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42913bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
42927de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
42933bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
42943bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
42953bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
42963bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
42982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
42992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
43012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
43022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
43032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
43042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
43052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
43062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
43132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
43142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
43162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
43172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
43182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
43192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
43202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
43212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
4327618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, TDLSDiscoverResponse) {
4328618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  const char kPeer[] = "peer";
43292b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>();
4330618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  SetTDLSManager(tdls_manager);
43313c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
4332618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_CALL(*tdls_manager, OnDiscoverResponseReceived(kPeer));
4333618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  TDLSDiscoverResponse(kPeer);
4334618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  Mock::VerifyAndClearExpectations(tdls_manager);
4335618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu}
4336c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4337618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter QiuTEST_F(WiFiMainTest, PerformTDLSOperation) {
4338618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  const char kPeerMac[] = "00:11:22:33:44:55";
43392b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  MockTDLSManager* tdls_manager = new StrictMock<MockTDLSManager>();
4340618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  SetTDLSManager(tdls_manager);
4341618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu
4342618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  Error error;
434362abf31989c52dc1e4ee5aae71664ba81d6fe2dbPeter Qiu  // No address resolution is performed since MAC address is provided.
4344618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_CALL(*tdls_manager,
4345618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu              PerformOperation(kPeerMac, kTDLSStatusOperation, &error))
4346618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu      .WillOnce(Return(kTDLSConnectedState));
4347618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_EQ(kTDLSConnectedState,
4348618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu            PerformTDLSOperation(kTDLSStatusOperation, kPeerMac, &error));
4349618d9d7ae7d1dac6ffac799d82a1f90218e349a6Peter Qiu  EXPECT_TRUE(error.IsSuccess());
4350c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
4351c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
43523946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
4353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage new_wiphy_message;
4354b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg));
4355b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  new_wiphy_message.InitFromPacket(&packet, NetlinkMessage::MessageContext());
43563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
4357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_));
4358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex));
4359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  GetAllScanFrequencies()->clear();
43603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
4361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies),
4362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan            GetAllScanFrequencies()->size());
4363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) {
4364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    EXPECT_TRUE(GetAllScanFrequencies()->find(freq) !=
4365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                GetAllScanFrequencies()->end());
4366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
43673946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
43683946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
43693946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
43703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
43713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
43723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
43733946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
43743946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
43753946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
43763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
43773946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
4378830e5d7924cb43a034f3188cc1f674416d2f74e6Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnConnectedAndReachable) {
4379787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopedMockLog log;
4380787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4381787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
43824bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
4383787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained")));
4384830e5d7924cb43a034f3188cc1f674416d2f74e6Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnConnectedAndReachable(_, _));
4385787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
4386787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPConfigComplete();
4387787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4388c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  // We should not call WakeOnWiFi::OnConnectedAndReachable if we are not
4389c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  // actually connected to a service.
4390c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  SetCurrentService(nullptr);
4391c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnConnectedAndReachable(_, _)).Times(0);
4392c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  ReportIPv6ConfigComplete();
4393c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan
4394c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  // If we are actually connected to a service when our IPv6 configuration is
4395c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  // updated, we should call WakeOnWiFi::OnConnectedAndReachable.
4396c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
4397c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
4398c08d8a9193703486ef89bb9cc2e8e624d223088cSamuel Tan  SetCurrentService(service);
4399787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained")));
4400830e5d7924cb43a034f3188cc1f674416d2f74e6Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnConnectedAndReachable(_, _));
4401787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPv6ConfigComplete();
4402787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4403830e5d7924cb43a034f3188cc1f674416d2f74e6Samuel Tan  // Do not call WakeOnWiFi::OnConnectedAndReachable if the IP config update was
44043c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  // triggered by a gateway ARP.
44053c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received")));
4406830e5d7924cb43a034f3188cc1f674416d2f74e6Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnConnectedAndReachable(_, _)).Times(0);
44073c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  ReportIPConfigCompleteGatewayArpReceived();
44083c3c36a37a885d0a2e180998587af8390744f757Samuel Tan
4409787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4410787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4411787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4412787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4413787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) {
441414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(true);
4415c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan  EXPECT_CALL(
4416c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan      *wake_on_wifi_,
4417d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan      OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _));
44184c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan  EXPECT_CALL(*this, SuspendCallback(_)).Times(0);
4419787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnBeforeSuspend();
442014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
442114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(false);
442214ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  EXPECT_CALL(*wake_on_wifi_,
442314ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan              OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _))
442414ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan      .Times(0);
44254c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess)));
442614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  OnBeforeSuspend();
4427787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4428787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4429787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) {
443014ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(true);
4431787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
4432d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan              OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _));
44334c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan  EXPECT_CALL(*this, SuspendCallback(_)).Times(0);
4434787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnDarkResume();
443514ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan
443614ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  SetWiFiEnabled(false);
443714ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  EXPECT_CALL(*wake_on_wifi_,
443814ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan              OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _))
443914ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan      .Times(0);
44404c9361f7eec1219a0b598092e56e8cb332d6f2ffSamuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorTypeIs(Error::kSuccess)));
444114ba19b3a0974811187f09f85a912a66963b8f3eSamuel Tan  OnDarkResume();
44423fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
44433fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
44443fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) {
44453fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  StartWiFi();
44463fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x);
44473fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x);
44483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId1[] = "/service/network/rpcid1";
44493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId2[] = "/service/network/rpcid2";
4450fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string path1(kNetworkRpcId1);
4451fc5236388674c3ae04255d98f5a3e93b789be185Peter Qiu  string path2(kNetworkRpcId2);
44523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service1, kNetworkRpcId1);
44533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service2, kNetworkRpcId2);
44543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_FALSE(RpcIdByServiceIsEmpty());
44553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1));
44563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2));
44573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  RemoveSupplicantNetworks();
44583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(RpcIdByServiceIsEmpty());
44593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
44603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
44615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) {
44625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
44635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  Device::ScanType scan_type = Device::kFullScan;
44645d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
44655d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
44666f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log, Log(_, _, ContainsRegex("Scan.* \\[full\\]")));
44675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
44685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
44695d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  scan_type = Device::kProgressiveScan;
44705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
44716f99f2cb25bead57398151880118a7794d5428a3Samuel Tan  EXPECT_CALL(log, Log(_, _, ContainsRegex("Scan.* \\[progressive\\]")));
44725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
44735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan}
44745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
44753fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) {
44763fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const Device::ScanType scan_type = Device::kFullScan;
44773fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
44783fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
44793fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(1);
44803fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
44813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetPendingService(service);
44823fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
44833fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
44843fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(
44853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      log,
44863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
44875d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
44883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
44893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
44903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
44913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
44925d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) {
44935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
44944b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  StartWiFi();
44955d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
44963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
44975d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
44985d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
44995d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
45005d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _));
45015d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
45025d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
45035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_TRUE(manager()->suppress_autoconnect());
45043fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
45053fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
45065d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) {
45075d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
45083fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
45095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
45105d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  SetPendingService(service);
45115d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
45125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
45133fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45145d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(
45155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      log,
45165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
45175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
45185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
45195d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
45205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _)).Times(0);
45215d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0);
45225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
45235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
45243fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
45253fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
45265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) {
4527381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  ScopedMockLog log;
45285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
45295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
45305d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
4531381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_CALL(netlink_manager_,
4532381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4533381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                                  TriggerScanMessage::kCommand),
4534381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                 _, _, _));
45355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
45375d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(0);
45385d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
45395d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
45405d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4541381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan}
4542381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan
45435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) {
45445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
45455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
45465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
45475d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs = {1};
45483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(netlink_manager_,
45493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
45503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                                  TriggerScanMessage::kCommand),
45513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                 _, _, _));
45525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
45535d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
45545d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(1);
45555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
45565d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
45575d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4558787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4559787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4560050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) {
4561050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // This test essentially performs ReportBSS(), but ensures that the
4562050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // WiFi object successfully dispatches events in order.
4563050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  StartWiFi();
4564050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4565050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss0",
4566050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0,
4567050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4568050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4569050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss1",
4570050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0,
4571050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4572050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSRemoved("bss0");
4573050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4574050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss2",
4575050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0,
4576050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4577050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4578050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00");
4579050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
4580050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
4581050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4582050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  InSequence seq;
4583050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0)));
4584050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1)));
4585050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiServiceRefPtr null_service;
4586050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0)))
4587050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      .WillOnce(Return(null_service));
4588050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2)));
4589050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  dispatcher_.DispatchPendingEvents();
4590050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
4591050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
45922b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  const WiFi::EndpointMap& endpoints_by_rpcid = GetEndpointMap();
4593050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_EQ(2, endpoints_by_rpcid.size());
4594050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
4595050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4596235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) {
4597235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag
4598235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // for having the wiphy index is set by ParseWiphyIndex.
4599235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex);
4600235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
4601b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  NetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg));
4602b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  msg.InitFromPacket(&packet, NetlinkMessage::MessageContext());
4603235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_TRUE(ParseWiphyIndex(msg));
4604235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex);
4605235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4606235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4607235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) {
4608235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  ScopedMockLog log;
4609235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ
4610235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // U32 attribute, so that this message no longer contains a wiphy_index to be
4611235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // parsed.
4612235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
4613b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  MutableNetlinkPacket packet(kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg));
46142b363903f38a515001c5edc7202403fcddb15a01Paul Stewart  struct nlattr* nl80211_attr_wiphy = reinterpret_cast<struct nlattr*>(
4615b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart      &packet.GetMutablePayload()->GetData()[
4616b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart          kNewWiphyNlMsg_Nl80211AttrWiphyOffset]);
4617235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ;
4618b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  msg.InitFromPacket(&packet, NetlinkMessage::MessageContext());
4619235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4620235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
4621235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                       "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY"));
4622235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_FALSE(ParseWiphyIndex(msg));
4623235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0);
4624235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4625235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4626d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) {
4627d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4628d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
4629b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  NetlinkPacket packet(
4630b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart      kActiveScanTriggerNlMsg, sizeof(kActiveScanTriggerNlMsg));
4631b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  msg.InitFromPacket(&packet, NetlinkMessage::MessageContext());
4632d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true));
4633d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4634d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4635d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4636d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) {
4637d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4638d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
4639b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  NetlinkPacket packet(
4640b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart      kPassiveScanTriggerNlMsg, sizeof(kPassiveScanTriggerNlMsg));
4641b5b41b5ce5d06e9df1dbd7f319cc49ff982eb84ePaul Stewart  msg.InitFromPacket(&packet, NetlinkMessage::MessageContext());
4642d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false));
4643d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4644d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4645d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4646853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4647