wifi_unittest.cc revision 3c898323878e95b40abcfc6c7a993555d4675323
18a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Use of this source code is governed by a BSD-style license that can be
3853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// found in the LICENSE file.
4853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
5d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi.h"
6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h>
85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h>  // Needs typedefs from sys/socket.h.
95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h>
10ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include <netlink/attr.h>
115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h>
12f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1711c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h>
19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
27125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h"
2826b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
30397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h"
317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
32b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
33853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
35084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h"
36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
37c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
4011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
41e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
42687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h"
433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
44cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
452ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
463426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
4710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
48af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h"
49a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
5002e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/ieee80211.h"
518d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/ip_address.h"
5202e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/mock_netlink_manager.h"
538d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_rtnl_handler.h"
548d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/mock_time.h"
5502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/netlink_message_matchers.h"
5602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_attribute.h"
5702e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#include "shill/net/nl80211_message.h"
58dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
60da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_bss_proxy.h"
61da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_eap_state_handler.h"
62da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_interface_proxy.h"
63da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_network_proxy.h"
64da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/mock_supplicant_process_proxy.h"
65da69ecfa906572120eb4f6c405e7d4be38dc9701Ben Chan#include "shill/supplicant/wpa_supplicant.h"
6685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
67af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
68d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_mac80211_monitor.h"
69d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_scan_session.h"
70d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wake_on_wifi.h"
71d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_provider.h"
72d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/mock_wifi_service.h"
73d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/scan_session.h"
74d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wake_on_wifi.h"
75d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_endpoint.h"
76d6a8b519e3057f52313e502f502a4819a942e089Ben Chan#include "shill/wifi/wifi_service.h"
77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
780e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
79a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set;
82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
83ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr;
84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
873c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
89a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
90cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
93b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
94549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
100dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
101d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
10211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref;
103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
104af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew;
105ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
106ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
108a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
109a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
110853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
1113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
1128ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
115853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
122c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234;
123125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999";
124235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
125235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// Bytes representing a NL80211_CMD_NEW_WIPHY message reporting the WiFi
126235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// capabilities of a NIC with wiphy index |kNewWiphyNlMsg_WiphyIndex| which
127235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// supports operating bands with the frequencies specified in
128235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan// |kNewWiphyNlMsg_UniqueFrequencies|.
129235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint8_t kNewWiphyNlMsg[] = {
130235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x68, 0x0c, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
131235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xf6, 0x31, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
132235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x70, 0x68, 0x79, 0x30,
133235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00,
134235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3e, 0x00,
135235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3f, 0x00, 0xff, 0xff, 0xff, 0xff,
136235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x40, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05, 0x00, 0x59, 0x00,
137235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x00, 0x00,
138235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x00,
139235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd1, 0x08, 0x00, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
140235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00,
141235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x8b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x18, 0x00, 0x39, 0x00,
142235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x01, 0xac, 0x0f, 0x00, 0x05, 0xac, 0x0f, 0x00, 0x02, 0xac, 0x0f, 0x00,
143235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0xac, 0x0f, 0x00, 0x06, 0xac, 0x0f, 0x00, 0x05, 0x00, 0x56, 0x00,
144235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x66, 0x00, 0x08, 0x00, 0x71, 0x00,
145235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x72, 0x00, 0x03, 0x00, 0x00, 0x00,
146235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x69, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6a, 0x00,
147235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x00, 0x04, 0x00, 0x01, 0x00,
148235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
149235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00,
150235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x09, 0x00, 0x50, 0x05, 0x16, 0x00, 0xf8, 0x01, 0x00, 0x00,
151235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00,
153235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00,
154235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x00,
155235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x6c, 0x09, 0x00, 0x00,
156235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00,
157235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
158235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00,
159235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
160235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7b, 0x09, 0x00, 0x00,
161235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00,
162235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
163235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00,
164235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
165235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x06, 0x00, 0x08, 0x00, 0x01, 0x00, 0x8a, 0x09, 0x00, 0x00,
166235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x07, 0x00,
167235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
168235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00,
169235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00,
170235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x09, 0x00, 0x08, 0x00, 0x01, 0x00, 0x99, 0x09, 0x00, 0x00,
171235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x14, 0x00, 0x0a, 0x00,
172235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
173235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00,
174235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa3, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
175235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x01, 0x00,
176235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa8, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
177235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6c, 0x07, 0x00, 0x00, 0x18, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00,
178235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb4, 0x09, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x08, 0x00, 0x06, 0x00,
179235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
180235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
181235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00,
182235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x00, 0x00,
183235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00,
184235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x6e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x04, 0x00,
185235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00,
186235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
187235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
188235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00,
189235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x09, 0x00,
190235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00,
191235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0b, 0x00,
192235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x54, 0x03, 0x01, 0x00,
193235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00,
195235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xef, 0x11, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 0x00,
196235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x05, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc0, 0x02, 0x01, 0x00,
197235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3c, 0x14, 0x00, 0x00,
198235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00,
199235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x50, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
200235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
201235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x64, 0x14, 0x00, 0x00,
202235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00,
203235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
204235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00,
205235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x8c, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
206235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
207235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x05, 0x00, 0x08, 0x00, 0x01, 0x00, 0xa0, 0x14, 0x00, 0x00,
208235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
209235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00,
210235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
211235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
212235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x08, 0x00, 0x01, 0x00,
213235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc8, 0x14, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
214235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
215235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x7c, 0x15, 0x00, 0x00,
216235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
217235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x09, 0x00,
218235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x90, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
219235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
220235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00,
221235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa4, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
222235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
223235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0xb8, 0x15, 0x00, 0x00,
224235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
225235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0c, 0x00,
226235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
227235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
228235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x01, 0x00,
229235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x15, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
230235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
231235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x0e, 0x00, 0x08, 0x00, 0x01, 0x00, 0xf4, 0x15, 0x00, 0x00,
232235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
233235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00,
234235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x08, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
235235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
236235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00,
237235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
238235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
239235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x11, 0x00, 0x08, 0x00, 0x01, 0x00, 0x30, 0x16, 0x00, 0x00,
240235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00,
241235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x20, 0x00, 0x12, 0x00,
242235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x44, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
243235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00,
244235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x14, 0x00, 0x13, 0x00, 0x08, 0x00, 0x01, 0x00,
245235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
246235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x85, 0x16, 0x00, 0x00,
247235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00,
248235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x08, 0x00, 0x01, 0x00,
249235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x99, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
250235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x1c, 0x00, 0x16, 0x00,
251235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xad, 0x16, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00,
252235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x07, 0x00, 0x00,
253235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1c, 0x00, 0x17, 0x00, 0x08, 0x00, 0x01, 0x00, 0xc1, 0x16, 0x00, 0x00,
254235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00,
255235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x07, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x00,
256235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00,
257235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x00,
258235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00,
259235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x04, 0x00,
260235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x05, 0x00,
261235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x68, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
262235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
263235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x1c, 0x02, 0x00, 0x00, 0xd4, 0x00, 0x32, 0x00,
264235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00,
265235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00,
266235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00,
267235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x19, 0x00, 0x00, 0x00,
268235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00,
269235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x00,
270235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00,
271235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x2b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x37, 0x00, 0x00, 0x00,
272235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x0d, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00,
273235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x43, 0x00, 0x00, 0x00,
274235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x10, 0x00, 0x31, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00,
275235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00, 0x42, 0x00, 0x00, 0x00,
276235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x13, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00,
277235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00, 0x54, 0x00, 0x00, 0x00,
278235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x16, 0x00, 0x57, 0x00, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00,
279235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x00, 0x00,
280235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x19, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00,
281235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6f, 0x00, 0x88, 0x13, 0x00, 0x00,
282235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x6c, 0x00, 0xac, 0x03, 0x63, 0x00, 0x04, 0x00, 0x00, 0x00,
283235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
284235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
285235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
286235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
287235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
288235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
289235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
290235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
291235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
292235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
293235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
294235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
295235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
296235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
297235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
298235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
299235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
300235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
301235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
302235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
303235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
304235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
305235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
306235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
307235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
308235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
309235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
310235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
311235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
312235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
313235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
314235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
315235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
316235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
317235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
318235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00,
319235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
320235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x50, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00,
321235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
322235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00,
323235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
324235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
325235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
326235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00,
327235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x84, 0x00, 0x07, 0x00,
328235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
329235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
336235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
337235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x08, 0x00,
339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
342235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
343235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
344235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
345235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
346235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
347235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
348235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
349235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x84, 0x00, 0x09, 0x00,
350235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
351235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00,
352235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
353235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x50, 0x00, 0x00, 0x00,
354235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
355235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x70, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x80, 0x00, 0x00, 0x00,
356235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
357235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00,
358235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
359235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xe0, 0x00, 0x00, 0x00,
360235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x14, 0x01, 0x64, 0x00,
361235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x06, 0x00, 0x65, 0x00,
362235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xd0, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x06, 0x00, 0x65, 0x00,
363235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
364235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3c, 0x00, 0x03, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
365235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
366235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00,
367235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
368235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
369235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x3c, 0x00, 0x04, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
370235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
371235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00,
372235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
373235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
374235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, 0x1c, 0x00, 0x07, 0x00,
375235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
376235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00,
377235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x14, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00,
378235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x09, 0x00,
379235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
380235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x20, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0x40, 0x00, 0x00, 0x00,
381235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00,
382235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xb0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x65, 0x00, 0xc0, 0x00, 0x00, 0x00,
383235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x06, 0x00, 0x65, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x79, 0x00,
384235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x50, 0x00, 0x78, 0x00,
385235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x4c, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x01, 0x00,
386235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00,
387235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x08, 0x00,
388235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x18, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,
389235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x0c, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x09, 0x00,
390235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00,
391235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x8f, 0x00, 0x03, 0x00, 0x00, 0x00,
392235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x1e, 0x00, 0x94, 0x00, 0x42, 0x08, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
393235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
395235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint32_t kNewWiphyNlMsg_WiphyIndex = 2;
396235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst int kNewWiphyNlMsg_Nl80211AttrWiphyOffset = 20;
397235dcec779704b782f0608421d890fe6d183e7ccSamuel Tanconst uint16_t kNewWiphyNlMsg_UniqueFrequencies[] = {
398235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457,
399235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    2462, 2467, 2472, 2484, 5180, 5200, 5220, 5240, 5260, 5280,
400235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640,
401235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    5660, 5680, 5700, 5745, 5765, 5785, 5805, 5825};
4025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
403d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint32_t kScanTriggerMsgWiphyIndex = 0;
404d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kActiveScanTriggerNlMsg[] = {
405d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x44, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
407d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
408d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x2d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x2c, 0x00,
410d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
411d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x71, 0x09, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00,
412d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x03, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
413d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x80, 0x09, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00,
414d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x06, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00,
415d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8f, 0x09, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00,
416d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x09, 0x00, 0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00,
417d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x9e, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00,
418d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0c, 0x00, 0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00,
419d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x64, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00,
420d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0f, 0x00, 0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00,
421d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xa0, 0x14, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00,
422d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x12, 0x00, 0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00,
423d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x7c, 0x15, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00,
424d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x15, 0x00, 0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00,
425d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xb8, 0x15, 0x00, 0x00, 0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00,
426d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x18, 0x00, 0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00,
427d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x30, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00,
428d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1b, 0x00, 0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00,
429d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x71, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00,
430d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1e, 0x00, 0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00,
431d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xad, 0x16, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00};
432d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
433d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tanconst uint8_t kPassiveScanTriggerNlMsg[] = {
434d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x40, 0x01, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,
436d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
437d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x0c, 0x00, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
438d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x04, 0x00, 0x2d, 0x00, 0x0c, 0x01, 0x2c, 0x00, 0x08, 0x00, 0x00, 0x00,
439d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x6c, 0x09, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x71, 0x09, 0x00, 0x00,
440d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x02, 0x00, 0x76, 0x09, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00,
441d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x7b, 0x09, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x80, 0x09, 0x00, 0x00,
442d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x05, 0x00, 0x85, 0x09, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
443d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8a, 0x09, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x8f, 0x09, 0x00, 0x00,
444d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x08, 0x00, 0x94, 0x09, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00,
445d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x99, 0x09, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x9e, 0x09, 0x00, 0x00,
446d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0b, 0x00, 0x3c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00,
447d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x50, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x64, 0x14, 0x00, 0x00,
448d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x0e, 0x00, 0x78, 0x14, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00,
449d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x8c, 0x14, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0xa0, 0x14, 0x00, 0x00,
450d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x11, 0x00, 0xb4, 0x14, 0x00, 0x00, 0x08, 0x00, 0x12, 0x00,
451d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xc8, 0x14, 0x00, 0x00, 0x08, 0x00, 0x13, 0x00, 0x7c, 0x15, 0x00, 0x00,
452d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x14, 0x00, 0x90, 0x15, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00,
453d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0xa4, 0x15, 0x00, 0x00, 0x08, 0x00, 0x16, 0x00, 0xb8, 0x15, 0x00, 0x00,
454d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x17, 0x00, 0xcc, 0x15, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00,
455d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x1c, 0x16, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x30, 0x16, 0x00, 0x00,
456d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1a, 0x00, 0x44, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1b, 0x00,
457d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x58, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x71, 0x16, 0x00, 0x00,
458d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x1d, 0x00, 0x85, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1e, 0x00,
459d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x99, 0x16, 0x00, 0x00, 0x08, 0x00, 0x1f, 0x00, 0xad, 0x16, 0x00, 0x00,
460d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    0x08, 0x00, 0x20, 0x00, 0xc1, 0x16, 0x00, 0x00};
461d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
4635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
4643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
465853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
4663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
4670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      : metrics_(nullptr),
4683946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        device_(
4693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal            new WiFi(control_interface(), dispatcher(), &metrics_,
4703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                     manager(), "wifi", "", kInterfaceIndex)) {
471853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
4723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
473853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
474853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
4753946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMetrics metrics_;
4768abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
477853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
478853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
4793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
480f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(device_->store().Contains(kNameProperty));
481de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
482853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
483853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
4846bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
485a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
486a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
4876bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
488de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
489f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanSignalThresholdProperty,
490a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
491a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
492a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
493a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
494a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
4956bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
496f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kScanIntervalProperty,
4976bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
4986bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
499a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
500853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
501a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
502a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
5036bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
504f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                          kScanningProperty,
5056bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
5066bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
507bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
5089d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
509a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
510853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
5114d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
5124d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
5136bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
5144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
515f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
5164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
5170654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
5184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5194d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5204d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
5214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
5224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
5236bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
5244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
525f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
5264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
5274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
5284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
5294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
5304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
5314a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
5320654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
5338abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
5344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
5364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
537e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
538e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
539f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5410654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
5428abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5438abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
5446bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
5458abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
546f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty,
547f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn),
5488abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
5490654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
550e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
551f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5520654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
5538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
555f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      device_->mutable_store(), kBgscanMethodProperty, &error));
556e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
557f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
5584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
5594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
5608abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
5618abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
5623c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
570e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
5713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
572bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  explicit WiFiObjectTest(EventDispatcher *dispatcher)
573e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
5740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        metrics_(nullptr),
5750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        manager_(&control_interface_, nullptr, &metrics_, &glib_),
576e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
577fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        wifi_(new WiFi(&control_interface_, dispatcher, &metrics_, &manager_,
578fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan                       kDeviceName, kDeviceAddress, kInterfaceIndex)),
5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
580fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan        mac80211_monitor_(new StrictMock<MockMac80211Monitor>(
581fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold,
582fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan            base::Closure(), &metrics_)),
583084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_service_proxy_(new MockDBusServiceProxy()),
584dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
585af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()),
586af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)),
587084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_manager_(new DBusManager()),
5880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
589735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
591af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan            new NiceMock<MockSupplicantInterfaceProxy>()) {
5923946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->mac80211_monitor_.reset(mac80211_monitor_);
5935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
594fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    InstallMockWakeOnWiFi();
595e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan    ::testing::DefaultValue<::DBus::Path>::Set("/default/path");
596c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
5973946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_))
5983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        .Times(AnyNumber());
5993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
600b108318d9554032feee1249d51c961e4f90f4561Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _))
601af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(Return(dhcp_config_));
602af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true));
6032d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    ON_CALL(*manager(), IsSuspending()).WillByDefault(Return(false));
604af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan
605af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateDBusServiceProxy())
606af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_));
607af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _))
608af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_));
609af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _))
610af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_));
611af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _))
612af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_));
613af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _))
614af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>());
615318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
616ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
617735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
618735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
619735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
6202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
6213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
6225c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
623bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
6245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
6250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
6265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
6285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
6295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
6305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
6315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
6323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6345c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
6353ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
6363ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
637d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
638084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->proxy_factory_ = &proxy_factory_;
639ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
6400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    static_cast<Device *>(wifi_.get())->rtnl_handler_ = &rtnl_handler_;
6415c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
6423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
6432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
6455c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
6465c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6475c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
6483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
6490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        .WillRepeatedly(Return(nullptr));
6500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SelectService(nullptr);
651b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
652b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
653b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
6543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
6550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->proxy_factory_ = nullptr;
6563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
6573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
6583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
6590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->Stop(nullptr, ResultCallback());
6600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->set_dhcp_provider(nullptr);
661084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Stop();
6620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    dbus_manager_->proxy_factory_ = nullptr;
6633ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
6643ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
665d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
666f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
667f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
668549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
669549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
6703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
6710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(false);  // Stop(nullptr, ResultCallback());
672549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
673549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
674c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
675c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
676c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
677c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
67817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
6790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    SetPendingService(nullptr);
68017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
681c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
6825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
6835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
6845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
6875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
6885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
6895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
6935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
7025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
7035f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    set<uint16_t> available_frequencies;
7045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
7055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
7065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
7075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
7085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
7095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
7105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
7125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
7135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
714f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
7150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                        nullptr);
7165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
7175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
719fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  void InstallMockWakeOnWiFi() {
720fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wake_on_wifi_ = new MockWakeOnWiFi(&netlink_manager_, event_dispatcher_,
72166bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan                                         &metrics_);
722fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan    wifi_->wake_on_wifi_.reset(wake_on_wifi_);
723fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  }
724fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan
7255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
7265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
7275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
7285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
7307347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  void OnTriggerScanResponse(const Nl80211Message &message) {
7315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
7325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
734b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
735b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
736b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    const char *reason) {
737b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
738b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
739b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
7409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
7410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
7420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
7430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
7440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
7457fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void SetRoamThresholdMember(uint16_t threshold) {
746227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    wifi_->roam_threshold_db_ = threshold;
747227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
748227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7497fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetRoamThreshold(uint16_t threshold) {
750227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->SetRoamThreshold(threshold, nullptr);
751227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
752227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7537fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t GetRoamThreshold() const {
754227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->GetRoamThreshold(nullptr);
755227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
756227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
7573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
7587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
7597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
7602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Simulate the course of events when the last endpoint of a service is
7613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
7623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
763bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
764bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
765bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
766bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
767bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
768bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
769bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        const WiFiEndpointConstRefPtr &endpoint) {
770bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
771bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
772bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
7733c5040174273386868cc8dea8044d22c465885d8Paul Stewart
7743c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
7753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
7763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
7773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
7783c5040174273386868cc8dea8044d22c465885d8Paul Stewart
7793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
780bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      const WiFiServiceRefPtr &service) {
7813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
7823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
7863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
7873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
7893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
7903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
7913c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
7923c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
7933c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
7943c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
7953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
7963c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
797a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      *ssid = StringPrintf("ssid%d", bss_counter_);
7983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
799a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *path = StringPrintf("/interface/bss%d", bss_counter_);
800a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_);
8013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
8023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
8033c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
8043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
8053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
8073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
8083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
8103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
8113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
8120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0);
8133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
8153c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
8163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
8173c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
8183c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
8193c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
8203c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
8213c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
8223c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
823f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kModeManaged,
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
8283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
8293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
8317fab89734d88724a288e96a9996b15548c5294c7Ben Chan                                         uint16_t frequency,
8323c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
8333c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
8343c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
8353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
8363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
8373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8433c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
8483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
8563c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
8577fab89734d88724a288e96a9996b15548c5294c7Ben Chan      uint16_t frequency,
8583c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
8593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
8603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
8643c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
8663c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
8673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
8683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
8693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
8713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
8723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
8740951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->ConnectTo(service.get());
8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
8770951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFrom(service.get());
8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
879d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  void InitiateDisconnectIfActive(WiFiServiceRefPtr service) {
8800951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    wifi_->DisconnectFromIfActive(service.get());
881d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  }
8823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
8853c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
8873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
8883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
8893c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
890a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    if (!network_path.empty()) {
891a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
892a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
893a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart          .WillOnce(Return(network_path));
8948e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(),
8958e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu                  SetHT40Enable(network_path, true));
896a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
897a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
8993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
9000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9063c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9103c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
9133c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
9143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
9153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
9163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
9173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
9183c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
9193c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
9213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
9233c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
9243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
9253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
9263c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
9273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
9280951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9293c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
931bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
932b108318d9554032feee1249d51c961e4f90f4561Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
9333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
934a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
9350654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
9360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
9393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
9401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
942b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
943b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
944b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
9452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
9462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
9470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kFullScan, nullptr, __func__);
9482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
9490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kProgressiveScan, nullptr, __func__);
9502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
951c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
9521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
9531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
9541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
955bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
956bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
957bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
9583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
959165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
9621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
9631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
9642b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
9652b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
9662b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
9671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
968446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
969446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
9702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  const ServiceRefPtr &GetSelectedService() {
9712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal    return wifi_->selected_service();
9722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  }
9737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const string &GetSupplicantBSS() {
9747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
9757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
9767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void SetSupplicantBSS(const string &bss) {
9777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
9787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
9791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
9801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
9811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
982b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
983b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
984b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
9853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
9873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
9893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
9903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
9928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
9938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
9943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
9963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
9973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
9983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
10003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
10013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
10023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
10037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
10047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
10057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
1006835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
1007835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
1008835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
10090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
10100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
10110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
1012381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
1013381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
1014381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
1015050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  map<string, ::DBus::Variant> CreateBSSProperties(const string &ssid,
1016050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                                                   const string &bssid,
1017050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                                                   int16_t signal_strength,
1018050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                                                   uint16_t frequency,
1019050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                                                   const char *mode);
1020261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
10257fab89734d88724a288e96a9996b15548c5294c7Ben Chan                 uint16_t frequency,
10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
1027c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
10283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, true);
10293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  }
10303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  void ReportIPConfigCompleteGatewayArpReceived() {
10313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan    wifi_->OnIPConfigUpdated(dhcp_config_, false);
1032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
1033050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1034050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // Calls the delayed version of the BSS methods.
1035050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  void BSSAdded(const ::DBus::Path &bss_path,
1036050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                const map<string, ::DBus::Variant> &properties) {
1037050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSAdded(bss_path, properties);
1038050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1039050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  void BSSRemoved(const ::DBus::Path &bss_path) {
1040050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    wifi_->BSSRemoved(bss_path);
1041050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  }
1042050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1043787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void ReportIPv6ConfigComplete() {
1044787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnIPv6ConfigUpdated();
1045787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1046f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
1047f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
1048f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1049f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
1050f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
1051f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
1052f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
1053f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
1054f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
10553cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  void ScanDone(const bool &success) {
10563cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanDone(success);
10573cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10583cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  void ReportScanFailed() {
10593cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    wifi_->ScanFailedTask();
10603cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
10613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
10625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
10635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
10645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
10655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
10665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
10675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
10685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
1069dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
10703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
10721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
10731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
10747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
10757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
10767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
10775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
10785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
10795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
10807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
10817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
10827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
10837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) {
10847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
10857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
1086baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
10870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetLinkStatistics(nullptr);
1088baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
1089cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
1090df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
1091cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
109211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
109311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      const WiFiServiceRefPtr &service, const string &rpcid) {
109411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
109511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
10963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  bool RpcIdByServiceIsEmpty() {
10973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    return wifi_->rpcid_by_service_.empty();
10983fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
1099bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
1100bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
1101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
1102e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
11030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetScanInterval(nullptr);
1104e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
11052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1111a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
11195412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _));
1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1121125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    StringCallback supplicant_name_owner_callback;
1122125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
1123125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      EXPECT_CALL(*dbus_service_proxy_.get(),
1124125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                  GetNameOwner(WPASupplicant::kDBusAddr, _, _, _))
1125125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu          .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated),
1126125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                          SaveArg<2>(&supplicant_name_owner_callback)));
1127125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu
1128084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Start();
11292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
11300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(true);  // Start(nullptr, ResultCallback());
1131125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
11320951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko      // Mimic the callback from |dbus_service_proxy_->GetNameOwner|.
1133125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error());
11343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
11352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
11362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
11372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11382f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
1139787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    EXPECT_CALL(*wake_on_wifi_, OnAfterResume());
11402f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
11412f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
11422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
1143fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    ResultCallback callback(
1144fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1145fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->OnBeforeSuspend(callback);
11462f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
1147787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  void OnDarkResume() {
1148787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    ResultCallback callback(
1149787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
1150787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    wifi_->OnDarkResume(callback);
1151787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
11523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  void RemoveSupplicantNetworks() {
11533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan    wifi_->RemoveSupplicantNetworks();
11543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11555d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  void InitiateScan(Device::ScanType scan_type) {
11565d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScan(scan_type);
11573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  void InitiateScanInDarkResume(const WiFi::FreqSet &freqs) {
11595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->InitiateScanInDarkResume(freqs);
1160381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  }
11615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  void TriggerPassiveScan(const WiFi::FreqSet &freqs) {
11625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan    wifi_->TriggerPassiveScan(freqs);
11633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  }
11642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
1165084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
11662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
11672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
1169084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
11702b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
11712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
11742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
1175687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
1176687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
1177687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
1178687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  void SetIPConfig(const IPConfigRefPtr &ipconfig) {
1179687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
1180687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
11814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
11824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
11834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
11844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
1185f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
11864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
11874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
11884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
11894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
11904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
11914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
11924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
11934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
11944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1195bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
1196bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
1197bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
119810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
1199db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
1200db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
1201db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
1202db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
1203e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
1204e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
1205e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
1206e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
12072d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void SetFastScansRemaining(int num) {
12082d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->fast_scans_remaining_ = num;
12092d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
12102d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
12111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
12121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
12131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
12161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
12171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
12181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
12193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
12203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
12213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
1223bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
12241369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
12251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
12261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
12271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
12283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
12293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
12303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
12313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
12328e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  void OnUnreliableLink() {
12338e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu    wifi_->OnUnreliableLink();
12348e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  }
12358e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
12367fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanShortInterval(const uint16_t &interval, Error *error) {
1237bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
1238bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1239bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12407fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) {
1241bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
1242bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
1243bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
12443c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  void ReportTDLSDiscoverResponse(const string &peer) {
12453c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    wifi_->TDLSDiscoverResponse(peer);
12463c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
12473c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
1248df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSDiscover(const string &peer) {
1249df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSDiscover(peer);
1250df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1251df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1252df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSSetup(const string &peer) {
1253df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSSetup(peer);
1254df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1255df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1256df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  string TDLSStatus(const string &peer) {
1257df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSStatus(peer);
1258df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1259df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1260df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSTeardown(const string &peer) {
1261df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSTeardown(peer);
1262df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
1263df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
1264c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  string PerformTDLSOperation(const string &operation,
1265c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              const string &peer,
1266c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              Error *error) {
1267c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
1268c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
1269c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
12703c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  void TimeoutTDLSDiscoverCleanupTimer() {
12713c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    wifi_->TDLSDiscoverPeerCleanup();
12723c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
12733c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
1274df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
1275df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
1276df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
1277df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
12783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  void OnNewWiphy(const Nl80211Message &new_wiphy_message) {
12793946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
12803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
12813946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
1282787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  bool IsConnectedToCurrentService() {
1283787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan    return wifi_->IsConnectedToCurrentService();
1284787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  }
1285787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
128610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
128710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
128810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
128910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
129085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
129185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
129285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
129385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
12943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
12953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
12963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
1297d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
1298d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
1299d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
1300d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1301d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
1302d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
1303d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
1304d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
1305d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
13063239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
13073239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
13083239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
13093239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
1310af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory *proxy_factory() {
1311b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
1312b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
1313b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
13143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
13153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
13163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
13173c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13183946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor() {
13193946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
13203946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
13213946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
13221964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  void ReportConnectedToServiceAfterWake() {
13231964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan    wifi_->ReportConnectedToServiceAfterWake();
13241964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  }
13251964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
13262d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  void StartScanTimer() {
13272d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan    wifi_->StartScanTimer();
13282d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  }
13292d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
1330235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  bool ParseWiphyIndex(const Nl80211Message &nl80211_message) {
1331235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return wifi_->ParseWiphyIndex(nl80211_message);
1332235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1333235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1334235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  uint32_t GetWiphyIndex() { return wifi_->wiphy_index_; }
1335235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1336d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  void SetWiphyIndex(uint32_t index) { wifi_->wiphy_index_ = index; }
1337d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
1338235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  std::set<uint16_t> *GetAllScanFrequencies() {
1339235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    return &wifi_->all_scan_frequencies_;
1340235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
1341235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
1342d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  void OnScanStarted(const NetlinkMessage &netlink_message) {
1343d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan    wifi_->OnScanStarted(netlink_message);
1344d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  }
1345d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
13463cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  bool ScanFailedCallbackIsCancelled() {
13473cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan    return wifi_->scan_failed_callback_.IsCancelled();
13483cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  }
13493cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
1350fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  MOCK_METHOD1(SuspendCallback, void(const Error &error));
1351fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
1352e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
13535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
1354fb02175e039a683cf9ac875ba0924858de6a08ffSamuel Tan  MockWakeOnWiFi *wake_on_wifi_;  // Owned by |wifi_|.
13555c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
13565c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
13573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1359dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
13603426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
1361f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
13622ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
1363c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
13653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
13663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
13673946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor_;  // Owned by |wifi_|.
13683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
13703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
13723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
1373626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
13743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
13753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
1376446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
1377446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
13787fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
13793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1380ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockDBusServiceProxy> dbus_service_proxy_;
1381ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
1382ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
1383f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
1384f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
1385084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  DBusManager *dbus_manager_;
1386735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
1387735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
1388735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
13890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
1390735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
1391bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1394ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1395af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
13963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1398e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1399e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1400e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1401e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1402446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1403446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
14047fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
14053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1406e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
1407b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1408261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1409261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1410050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartmap<string, ::DBus::Variant> WiFiObjectTest::CreateBSSProperties(
1411050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    const string &ssid,
1412050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    const string &bssid,
1413050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    int16_t signal_strength,
1414050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    uint16_t frequency,
1415050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart    const char *mode) {
14163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
14173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
14183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
14193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
14203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
14213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
14223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
14233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1424a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
14253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
14263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
14273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
14283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
14293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
14300654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
1431e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
14320654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
1433e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
14340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
1435050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1436050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  return bss_properties;
1437050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
1438050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
1439050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
1440050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                             const string &ssid,
1441050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                             const string &bssid,
1442050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                             int16_t signal_strength,
1443050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                             uint16_t frequency,
1444050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                             const char *mode) {
1445050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  wifi_->BSSAddedTask(
1446050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      bss_path,
1447050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties(ssid, bssid, signal_strength, frequency, mode));
14483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
14493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1451e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1453e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1456a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1457a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1458a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1459a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1461a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1462a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
14639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
14649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
14659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
14669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1468f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1469a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
14739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
14749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
14759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
14769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
14779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
14799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
14809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
14819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
14829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
14839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
14849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
14879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
14889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
14899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
14909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1491a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1492a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
14939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
14949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
14959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
14969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
14979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
14989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
14999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
15009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
15019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1503a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
15042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1505a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1506a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
15072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
15082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1509a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
15102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1511f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1512a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1517a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1518a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1519f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1520a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1521a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1522a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1523a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1524a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1525a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1531a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1532a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1534a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1538a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1539a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1540a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1541a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1542a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1543e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1544e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1545e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
15463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
15470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
15480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
15493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
15510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
15520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
15533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
15543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15552b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
15562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
15572b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
15582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1559227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1560227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1561227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1562227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1563227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1564227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1565227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1566227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1567227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1568227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1569227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1570227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1571227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1572227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1573227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1574227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1575227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1576227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1577227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
15782b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
15790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
15802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
15812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
15820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
15832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1584227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1585227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1586227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1587227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1588227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1589227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1590227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1591227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
15922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
15930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
15949cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
15959cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
15969cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
15979cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
15989cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
15999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
16002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16022b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16079cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
16089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
16099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
16109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
16122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16142b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
16150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
16162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
16180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
16192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
16222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
16232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
16262b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
16272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
16282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
16292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
16302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
16312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
16322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1633549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
16343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16370afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
1638549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1639549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1640c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1641549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1642549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1643549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
1644ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1650549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1651549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
16520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1653549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1654549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
16555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
16565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
16583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
16593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
16603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
16613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
16623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
16633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1664b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
16653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
16673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
16693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
16735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
16745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
16755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
16765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
16785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
16795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
16805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
16845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1686835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1688835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
16890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
16910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  ClearCachedCredentials(service.get());
1692835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1693835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
16940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
16950427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
16960427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
16970427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
16980427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
16990427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
17000427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1701381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1702381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1703381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1705381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1706381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1707381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1708381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1709381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
17103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1711381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1712381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1713381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1714381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1715381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1716381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1717381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1718381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1719ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1720316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1721316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1722316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1723316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1724b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1725316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1726316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1727316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1728316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1729316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1730316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1731316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1732316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1733316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1734b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1735ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1736ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
17370951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
1738316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1739316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1740316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1741316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
1742b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false))
1743316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1744316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1745ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1746ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1747381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1748381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1750381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1751381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1752381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1753381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1754381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1755381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1756381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1757381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1758381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1759381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
17603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1761381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1762381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1763381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1764381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1765381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1766381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1767381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1768381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
17695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
17705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
17713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
17723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
17733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
17743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
17753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
17762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
17773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
17783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
17793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17803239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
17835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
17845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
17855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
17865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
17875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
17885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
17895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
17905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
17963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
17973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
17983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
17993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
18003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
18015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
18022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
18032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
18043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1808f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
18092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
18102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
18112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1813c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
18142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1815c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1816c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18170951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
18202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
18212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
18222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
18252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
18262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1827c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1828c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18290951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1831c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
18322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
18340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1835c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1837c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
18382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1839c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1840c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18410951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1843c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
18442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
18452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
18462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
18472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1848c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1849c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
18532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1855c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1856c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
18575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
18582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
18592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
18602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1862f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
18632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
18642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
18652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
18675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18700951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
18742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
18752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
18762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
18792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
18812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18830951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
18872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
18882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
18890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
18905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
18915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
18922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
18932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
18955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18960951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
18972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
18982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
18992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
19002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
19015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
19022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
19045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19050951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
19062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
19075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19093cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiMainTest, ResetScanStateWhenScanFailed) {
19103cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  StartScan(WiFi::kScanMethodFull);
19113cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ExpectScanStop();
19123cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
19133cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ReportScanFailed();
19143cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
19153cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
19163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1920ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1921ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19235c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1924ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1925ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
19262f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1927ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1928ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1929ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
19315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
19375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
19390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
19400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
19410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19453a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel TanTEST_F(WiFiMainTest, ResumeDoesNotScanIfConnected) {
19463a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  StartWiFi();
19473a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19483a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19493a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ReportScanDone();
19503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  CancelScanTimer();
19513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
19523a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  ASSERT_TRUE(wifi()->IsIdle());
19533a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19543a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  OnAfterResume();
19553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(GetScanTimer().IsCancelled());
19563a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  InstallMockScanSession();
19573a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  SetCurrentService(MakeMockService(kSecurityNone));
19583a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19593a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan  dispatcher_.DispatchPendingEvents();
19603a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan}
19613a0950c3a22d1b090aa2a68c2e7f48f26bd4a758Samuel Tan
19625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
19635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1965ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1966ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1968ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1969ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1971ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1972ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1973ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
19745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
19755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
19765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
19805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
19825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
19835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
19875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1989ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1990ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
19913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
19920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
19930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
19943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
19953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
19963ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1998ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19992f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
2000ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
2001ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
2002ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
20035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
20045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
20055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
20065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
20090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
20105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
20115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
20125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
20130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
20145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2015df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
20165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
20175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) {
20218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
202270068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
20238e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
20248e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1);
20258e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnAfterResume();
20268e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20278e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
20288e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
20293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
20303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
20313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2032e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
20333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2034e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
20353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2036e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
20373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2038e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
20397fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
2040e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
2041e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
2042e41a72d0737488d561a4158019409d5785dad61bThieu Le
2043e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
2044e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
2045e41a72d0737488d561a4158019409d5785dad61bThieu Le
2046e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
2047e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
2048e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
2049e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
2050e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
2051e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
2052e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
2053e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
2054e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
2055e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
2056e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
2057e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
20583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
20593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
20603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
20613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
20653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
20663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
20673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
20713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
20733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
20743c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
2075381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  manager()->set_suppress_autoconnect(true);
20763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
2077381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
20783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
20793c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
2081b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
20820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
2083e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
2084b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
2085e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
2086e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
20878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
20888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
20898a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
20908a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
20913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
20923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
20943c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
2095ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
20963c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
21008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2102261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
2103261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
2104261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
2105261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
21110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
21123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
21133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
21143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
21153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2116835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
2117835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
21190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
2120835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2123835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
21270654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2128835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2129835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
2130a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
2131a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
21323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
2134835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
2135835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
2136835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
21370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
21380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
21393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
21400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
21413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
21423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21434943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
21444943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21454943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
21464943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
21474943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
21480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21494943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
21504943822214f823c2437aa32b0376414b3e60388dPeter Qiu
21514943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
21524943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
21534943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
21540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
21554943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
21564943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21574943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
21583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
21610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
21620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
21650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
21670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
21683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
21690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
21723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
21733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
21753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
21760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
21773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
21813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
21823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
21843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
21850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
21870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
21880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
21890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
21900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
21912b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
21920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
21930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
21940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
21953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
21963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
21970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
21983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
21994943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
22000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
22010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
22020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
22030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
22040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
2205835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
2206835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
2207ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
2208af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
2209af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
2210af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
2211af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
2212835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
2213735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
22143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
22154943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
22164943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
22174943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22194943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22204943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
22214943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22224943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
22234943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
22244943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ::DBus::Path kPath("/fake/path");
22250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22264943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22274943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
22284943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22294943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
22304943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
22314943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
22324943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22334943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
2234ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
22354943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
22364943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
22374943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
22384943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
22394943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false));
22404943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
22414943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
22424943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
22434943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
22440654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
22480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
2249c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
22503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
22513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
22520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
2254c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
22553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2256c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
2257c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
2258c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
2259c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
22600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
22610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
2262c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
2263c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
22640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
22650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
22664943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
22670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
22684943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(),
22690afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
22700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
22730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
22740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
22750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
22760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
22772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
22784943822214f823c2437aa32b0376414b3e60388dPeter Qiu
22794943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
22804943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
22814943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
22832b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
22841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
22851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
22861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  DBus::Path kPath("/fake/path");
22870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
22881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
22901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
22911aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
22921aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22941aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
22951aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
22961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
22971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
22981aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
22990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
23000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
23011aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
23021aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
23031aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
23041aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
23051aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
2306d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
2307d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2308d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
23090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2310d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2311d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2312d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2313d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2314d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2315d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
2316d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
2317d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2318d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2319d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23200951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2321d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2322d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2323d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2324d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2325d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
2326d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2327d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
23280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2329d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2330d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(),
23310afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
2332d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2333d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2334d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2335d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2336d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2337d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
2338d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
2339d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
2340d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(0);
2341d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2342d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2343d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2345d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2346d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2347d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2348d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2349d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
2350d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
2351d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
23520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
23530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
2354d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
2355d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
2356d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2357d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
2358d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
2359d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
2360d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
2361d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
2362d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
2363d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(1);
2364d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
2365d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
2366d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
23670951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
2368d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
2369d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2370d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
2371d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
237217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
23739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
237417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
237517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
23769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
23779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
237844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
237944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
238017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
238117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
238217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
23830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
23840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
23850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")))
238617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
238717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
238817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
238933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
239017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
23910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
239244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
2393a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
239444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
2395a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
2396a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2397a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
23980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
23990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
24000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
240117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
24020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
240333a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
240433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
24050951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
24060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
24070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
24080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
240917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
241017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
241117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
24122b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
24132b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
24142b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
24153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
24160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24172b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
24182b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
241917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
242017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
24210d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
24220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
24230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")));
242417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
242517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
242617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
242717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
24290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
24300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
24330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
24343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
24350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
24363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
24370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
24380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
24430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
24443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
24450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
24460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
24470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
24480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
24500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
24510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
24530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
24545c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2455c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
24563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
24573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
24580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart
24623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
24630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
24650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
24663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2467c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2468b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2469c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
24705c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
24715c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2472549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
24733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
2477ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
24783c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
24793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
24813c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
24823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2483549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
24840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2485549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2486549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2487446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
24883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
24893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
24900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
24913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
24921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
24950654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
24961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
24970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
24981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2499446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
25001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
25010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
25021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
25041aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
25053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
25061aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2507446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2508446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2510a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
2512ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
2513ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2514ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2515ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2516ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
2517ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
2518ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
2519ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2520ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2521ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2522ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
25233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
25243c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
25253c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
25280654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
2530ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2531ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
25335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
25353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
25363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
25373c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
25393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
25405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
25415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
25423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart
25455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
25465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
25475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
25485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
25535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
25545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
25555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2557ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
25585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25595412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
25605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
25645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
25685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
25695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
25725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
25735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
25745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
25755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
25765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
25775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
25785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
25793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25803c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
25815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
25835412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2584ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2585ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2586ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2587fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2588fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2589fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2590fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2591fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
25923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
25935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2594fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2595fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2596fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
2597fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2598fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2599fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2600fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
26011e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
26021e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
26031e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
26041e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26051e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
26061e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
26071e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal      .WillOnce(Throw(DBus::Error("don't care", "don't care")));
26081e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
26091e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
26101e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26111e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
26121e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
26135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
26145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
26155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
26165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
26175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
26199f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
26207de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
26215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
26242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
26255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
26275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2630f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2631df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2634f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
26365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
26385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
26395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
26405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
26415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
26425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
26445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
26475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
26485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
26495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
265144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
265244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
265344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
265444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
26555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
26569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
26575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
26602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
26617de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
26645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
26675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
26685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
26695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
26705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
26715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
26725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
26740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
26755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2678a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2679a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
26805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
26810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
26820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
26860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
26870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
26882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
26892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
26902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
26915412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
26922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
26935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
26942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
26952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
26965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
26975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
26980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
26995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
27005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
27010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
27022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
27030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
27042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
27050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
27065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
27075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
27087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
27097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
27107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
27127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
27137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
27140654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
27150654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
27167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
27187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
27197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
27207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
27217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2722f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
27237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
27247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
27250654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
27267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
27277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
27287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2729d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
27307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
27327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
27337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
27347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
2735b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2736d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
27377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
27387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2739f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2740bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2741bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2742bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
27437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
27440654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
27450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
27460654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
27477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
27487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
27497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
27500951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
27513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
27527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
27537ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2754a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
2755a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2756a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2757a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2758f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2759a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2760a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2761a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2762a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2763a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2764a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2765a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2766a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2767a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2768a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2769a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2770a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2771a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2772a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2773a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2774f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2775a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
27760654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
27770654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2778a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2779a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2780a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2781a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2782a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2783a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2785a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2786a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2787a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
27882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2789a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
27900654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
27910654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2792a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
27930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2794a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2795a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
27961590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
27971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
27983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
27993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
28000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr);
28011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
28024943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
28030654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
28040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
28050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2806687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
28081590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
28091590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
28101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
28113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
28120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
28133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
28143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
28150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
28163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
28171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2818c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2819c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2820c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2821c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
28223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
28233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
28243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2825bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2826a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
28270654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
28283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2829687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28300951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service0.get());
28310951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service1.get());
28321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
28331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2834e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2835e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
28360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
28370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
28380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
28400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
28413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
28423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
28433c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
28443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
28453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2846687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
28470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2848687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2849687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2850687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2851687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2852687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2853687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2854687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2855687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2856687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
28570951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(ipconfig.get());
2858687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
28594eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
28604eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
28618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
28628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
28633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
28640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
28653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
28668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
28673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
28680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
28693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
28700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
28718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
28728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
287349c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
287449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
287549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ::DBus::Path bss_path;
287649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
287749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
28780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, &bss_path));
287949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
28800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
288149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
288249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
288349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
288449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
288549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
288649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
288749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
288849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
288949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
28900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
28910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
289249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
289349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
289449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
28958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
28968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
28978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
28983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
28990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
29008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
29018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
29028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
29034a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
29040654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
29059d97b7deda3ae604d718873207a951f62d418b34Paul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) &&
29060654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
29074d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
29084d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
29094d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
29104d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
29113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
29120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2913a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
29143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
29150654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
29164d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
29174d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
29184d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
29194a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
29204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
29213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
29220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2923a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
29243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
29254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
29264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
29284a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
29294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2930f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
29314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
29334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
29343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
29350951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29360951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29370654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
29384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
29414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
29423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
29430951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29440951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
29464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
29474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
29480654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
29494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
29504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
29514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
29524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
29544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
29554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
29584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
29590654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
29604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
29613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29620951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    AppendBgscan(service.get(), &params);
29630951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
29654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
29664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
29670654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
29684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
29694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
29704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
29714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
29724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
29734a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
29744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
29755c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
29765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
29770654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
29785c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
29793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
29805c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
29810951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko    Mock::VerifyAndClearExpectations(service.get());
29825c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
29835c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
29845c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
29850654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
29865c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
29875c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
29884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
29894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2990c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2991c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
29923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
29930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
2994c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2995c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2996c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2997c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2998c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2999c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
30000951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3001c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
3002c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3003c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
3004c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
30053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
30060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
30078f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
3008c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
30098f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
30108f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
30110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
30125519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
30133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
30143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
30153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
30168f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
30178f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
30185519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
30195519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
30203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
30213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
30223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
30230654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3024c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
3025c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
3026b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
3027b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
3028b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
3029b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
3030b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
3031b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
3032b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
3033b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
3034b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3035b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
3036b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
3037b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
3038b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
3039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
3040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
3041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
3042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
30433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
30440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
30450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
30463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
3047b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
3048b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
3049b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
3050b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
3051b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
30525c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
30535c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
30545c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
30555c05b2920be742d518829972127172481722058dmukesh agrawal
30565c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
30575c05b2920be742d518829972127172481722058dmukesh agrawal
30585c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
30595c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
30605c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
30613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
30625c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
30632f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
30645c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
30655c05b2920be742d518829972127172481722058dmukesh agrawal}
30665c05b2920be742d518829972127172481722058dmukesh agrawal
3067402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel TanTEST_F(WiFiMainTest, CallWakeOnWiFi_OnScanDone) {
3068402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  StartWiFi();
3069402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
30704b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // Call WakeOnWiFi::OnNoAutoConnetableServicesAfterScan if we find 0 auto-
30714b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  // connectable services.
3072402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3073402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
3074402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30754b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _));
3076402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3077402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3078402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If we have 1 or more auto-connectable services, do not call
3079402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3080402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3081402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(1));
3082402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_TRUE(wifi()->IsIdle());
30834b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3084402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3085402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3086402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
3087402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // If the WiFi device is not Idle, do not call
3088402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  // WakeOnWiFi::OnNoAutoConnetableServicesAfterScan.
3089402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  SetCurrentService(MakeMockService(kSecurityWep));
3090402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_FALSE(wifi()->IsIdle());
3091402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  EXPECT_CALL(*wifi_provider(), NumAutoConnectableServices())
3092402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .WillOnce(Return(0));
30934b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnNoAutoConnectableServicesAfterScan(_, _, _))
3094402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan      .Times(0);
3095402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan  ReportScanDone();
3096402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan}
3097402bf2959e8b2c68627a7b66203ec84760bf2e03Samuel Tan
30985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
30995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
3100b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3102b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3103b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3104b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31067de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
31070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3108b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
3109b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3113b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
31155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
31165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
31185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
31195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
31200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
3121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
31225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
31235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
31245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
31255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
31265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
31275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3128b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
3129b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3130b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3131b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3132b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3133b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
3135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
3136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
3138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3141b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3142b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3143b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
3144b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3145b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
31463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
31470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr);
3148b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3149b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3150b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3151b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
3153b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
3154b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3155b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
3156b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiMainTest, ScanTimerSuspending) {
31592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EnableFullScan();
31602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartWiFi();
31612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  ReportScanDone();
31632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  CancelScanTimer();
31642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());
31652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
31662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
31672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*manager(), IsSuspending()).WillOnce(Return(true));
31692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
31702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  FireScanTimer();
31712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  dispatcher_.DispatchPendingEvents();
31722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_TRUE(GetScanTimer().IsCancelled());  // Do not re-arm.
31732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
31742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3175b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
3176b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3177b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3178b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3179b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
3181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3182b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3184b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
3185b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
3187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
3190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3192b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3193b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
3194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
3196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
31970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
3198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
3199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3200b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
32025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
32035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
32045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
32050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
32065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
32075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
32085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
3209a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
32105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
32125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
32135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
32145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
32155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
32165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
32175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3218b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
3219b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3220b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
32215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
32220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
3223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
32243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
32253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
32263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
3227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
32283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32293c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
32305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
32310654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3232b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3233b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3234b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
3235b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
3236b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
3237b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
32380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
3239b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
3240df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
32413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
32423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
32430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
3245b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
3246b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
32473c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
32483c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
32492ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
32502ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
32513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
32522ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
32533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
32543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
32553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
32562ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32572ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
32582ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
32593c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
32603c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
3261daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32632ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32642ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32652ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
32662ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
32672ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
32682ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
32692ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
32702ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
32712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32722ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
32732ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
3274a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3275a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  SetCurrentService(service);
32762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
32773c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3278daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
3279daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1);
32803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
32813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3282a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu
3283a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  // Service is unreliable, skip reassociate attempt.
3284a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  service->set_unreliable(true);
3285a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
3286a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu                       EndsWith("skipping reassociate attempt."))).Times(1);
3287a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
3288a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  OnLinkMonitorFailure();
3289a388fdb2e74717ba2440a605f208647dd7cd3e06Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
32913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
32928e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) {
32938e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
329470068780b1b830c4d7daf4b1af8600c012dc9142Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
32958e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
32968e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1);
32978e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnUnreliableLink();
32988e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
32998e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
33008e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
3301cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
3302f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3303bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
3305cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3306cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3307bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
3308f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
33090654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3310bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3311bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
3312bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
33130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33141369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3315bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
33161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
3317cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3318cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3319f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
3320f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
3321f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
3322f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
3323a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3324f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
3325f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
3326f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3327f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
3328f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
3329f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
3330f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
3331f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
3332b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
3333f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
3334f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3335f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3336f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3337f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
3338f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3339f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
33400951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3341f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3342f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
3343f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
3344f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
3345f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
3346f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3347f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
3348f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
3349f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
3350f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
3351f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3352f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
3353f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
3354f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
33550d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33560d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
3358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33590951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
3362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
3363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
33650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
33660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
3368f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
33690951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
3371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
3372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
3373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3374f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
3375f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
33760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
33770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
33780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    StrEq("OnIPConfigFailure")));
3379f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
3380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
3381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
33821369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
3383f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3384735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3385735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3386735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
3387735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
3388735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3389bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
33900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
33910951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3392bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3393bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
33941369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
3395bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
33961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
33970951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3398bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3399bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
34000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
34010951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3402bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
3403bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
3404bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
34050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
34061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
34071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
34081369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
3409f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
3410cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
34110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
3412cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
3413a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3414bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3415f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
34164943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3417735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3418cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3419f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
34211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
34221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
34231369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
3424f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
34251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
34261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
3427735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
3428735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
34294943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
3430735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
3431735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
3432735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
3433735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
3434735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
3435bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
3436735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
34371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
343839a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
3439735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
34400654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3441cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
3442cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
34431964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiMainTest, ReportConnectedToServiceAfterWake_CallsWakeOnWiFi) {
34441964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
34451964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan              ReportConnectedToServiceAfterWake(IsConnectedToCurrentService()));
34461964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  ReportConnectedToServiceAfterWake();
34471964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
34481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
3449e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
3450e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
34511aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
3452e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
34531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
3454e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3455e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
3456e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
3457e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3458e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
3459e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
3460e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34611aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
3462e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
3463e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
3464e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
3465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
3467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
3468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
3469e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
3470e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
3471e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
3472e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
3473e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
3474e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
3475e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
3476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
3478e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
3479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3480e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
3482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
3484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
3485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
3488e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
3489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
3490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
34931aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
349466bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  // This is to cover calls to PostDelayedTask by WakeOnWiFi::StartMetricsTimer.
349566bddc67c71dd197211ca08c5a4835bd6cfa5ed2Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
34960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
3497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
3498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
3499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3502e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
3503e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3504e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3505e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3506e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
3507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
35151aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
35161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
35171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
35190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
35201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
35271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
35331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
35361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
35411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
35421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
35431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
35447cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
35457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
35467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
35477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
35497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
35507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
35510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
35527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
35537cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35555412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
35567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
35577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
35587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
35607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35610afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
35627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
35657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
35667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
35677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
35687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
35717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
35727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
35737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
35747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
35757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
35777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
35787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
35807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
35817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
35825412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
35837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
35847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
35857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
35867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
35877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
35887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
35897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
35907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
35917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3592baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3593baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3594baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3595baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
35967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
35977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
35987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
35997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
36007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
36017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
36027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
36037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
36047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
36057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
36067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3607baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
36087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3609baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3610baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3611baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3612baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3613baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3614baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3615baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3616baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3617baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3618baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3619baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3620baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3621baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3622baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3623baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3624baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3625baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3626baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3627baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3628baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3629baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3630baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3631baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3632baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3633baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3634baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3635baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3636baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3637baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3638baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3639baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3640baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3641baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3642baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3643baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3644baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3645baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3646baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3647baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3648baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3649baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3650baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3651baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3652baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3653baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3654baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3655baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3656baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
36577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
36587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
36597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
36607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
36618e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
36627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
36637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
36647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3665baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3666baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3667baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3668baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3669baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3670baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3671baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3672baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3673baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3674baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3675baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3676baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3677baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3678baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3679baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3680baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3681baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3682baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3683baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3684baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3685baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3686baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3687baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3688baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3689baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3690baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3691baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3692e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3693e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3694e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3695e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3696e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3697e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3698e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3699e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3700e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3701e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3702e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3703e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3704e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3705e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3706e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3707e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3708e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3709e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3710e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3711e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3712e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3713e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3714e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3715e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3716e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3717e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3718e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3719e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3720e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3721e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3722e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3723e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3724e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3725e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3726e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3727e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3728e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
37298e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
37308e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3731e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3732e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3733e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3734e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3735e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3736e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
37377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
37387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
37391964b5de186ef06fa89a78b27c3a112686bc36f7Samuel TanTEST_F(WiFiTimerTest, ResumeDispatchesConnectivityReportTask) {
37401964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
37411964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
37421964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  StartWiFi();
37431964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
37441964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  EXPECT_CALL(
37451964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      mock_dispatcher_,
37461964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan      PostDelayedTask(_, WiFi::kPostWakeConnectivityReportDelayMilliseconds));
37471964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan  OnAfterResume();
37481964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan}
37491964b5de186ef06fa89a78b27c3a112686bc36f7Samuel Tan
37502d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_ReturnsImmediately) {
37512d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37522d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  // Return immediately if scan interval is 0.
37532d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(0, &e);
37542d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
37552d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37562d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37572d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37582d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_HaveFastScansRemaining) {
37592d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37602d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37612d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37622d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(1);
37632d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_,
37642d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan              PostDelayedTask(_, WiFi::kFastScanIntervalSeconds * 1000));
37652d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37662d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37672d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
37682d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel TanTEST_F(WiFiTimerTest, StartScanTimer_NoFastScansRemaining) {
37692d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  Error e;
37702d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  const int scan_interval = 10;
37712d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetScanInterval(scan_interval, &e);
37722d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  SetFastScansRemaining(0);
37732d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, scan_interval * 1000));
37742d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan  StartScanTimer();
37752d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan}
37762d36a6e266deb96db1d3cf4b18dcc9d863795f28Samuel Tan
3777bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3778f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3779bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3780bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3781bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3782bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3783bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
3784bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3785bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3786bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3787bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3788bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3789bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3790bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3791bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
37927fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
37930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
3794bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3795bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3796bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3797bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3798bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3799bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3800bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
38010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
3802bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
3803bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3805db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3806db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
38073cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel TanTEST_F(WiFiTimerTest, ScanDoneDispatchesTasks) {
38083cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanFailedTask if scan failed.
38093cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
38103cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_,
38113cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan              PostDelayedTask(_, WiFi::kPostScanFailedDelayMilliseconds));
38123cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(false);
38133cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_FALSE(ScanFailedCallbackIsCancelled());
38143cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
38153cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // Dispatch WiFi::ScanDoneTask if scan succeeded, and cancel the scan failed
38163cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  // callback if has been dispatched.
38173cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_CALL(mock_dispatcher_, PostTask(_));
38183cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  ScanDone(true);
38193cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan  EXPECT_TRUE(ScanFailedCallbackIsCancelled());
38203cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan}
38213cd46cd843c0c4db3e931f8e3cc96e2f0c577d49Samuel Tan
3822db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
382311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3824db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3825db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3826735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3827735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3828735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3829735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3830db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3831db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3832db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3833f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3834db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3835735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3836db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3837735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
38380951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko  Mock::VerifyAndClearExpectations(service.get());
3839735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3840db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3841735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3842735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3843735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
38440d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
38450d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38460d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
3847735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
384811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
384911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  MockEapCredentials *eap = new MockEapCredentials();
385011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
385111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
385211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
385311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
385411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
385511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
385611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
385711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
385811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
38590d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
38600d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
38610d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
386211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
386311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
386411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
386511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
386611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
386711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
386811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
386911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
38700d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
387111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
387211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
387311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
387411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
387511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3876bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3877bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3878c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3879c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3880c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3881c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3882c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3883c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3884c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3885c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3886c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3887c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3888c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3889c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
38906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
38916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
38926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
38936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
38946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
38957fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
38966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
38976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
38986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
38996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
39006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
39016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
39026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
39036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
39046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
39056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
39066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
39076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
39086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
39096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
39106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
39116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
39126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
39146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
39156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
39166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
39176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
39186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
39206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
39216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
39226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
39236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
39246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
39256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
39267347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
39277347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
39286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
39295581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
39305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
39315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
39335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
39345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
39355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
39395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
39405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
39410654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
39425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
39445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
39475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
39485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
39490654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
39500654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
39510654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
39520654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
39530654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
39540654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
39550654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
39560654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
39575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
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  Mock::VerifyAndClearExpectations(process_proxy);
39675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
39695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
39705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
39710654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
39720654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
39735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
39745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
39785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
39795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
39800654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
39810654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
39825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
39835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
39855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
39875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
39885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
39890654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
39900654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
39915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
39935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
39945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
39955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
39965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
39975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
39985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
39995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
40005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
40015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
40025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
400350cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
400450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
400550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
400650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
400750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
4008bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
4009bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
4010bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
4011bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
4012bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4013bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40147fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
4015bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4016bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
4017bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4018bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4019bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
4020bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4021bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4022bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4023bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
4024bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4025bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
40267fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
4027bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
4028bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4029bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4030bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
4031bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
4032bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4033bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4034bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
4035bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
4036bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
4037bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
4038bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
4039bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
4040bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
4041bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
4042bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
40430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
40440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40450cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
40469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
40470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
4048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4052a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
40557de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
40560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
40570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
40580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
40600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
40610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
40620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40630cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
40649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
40650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
40660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
40679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
40689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
40699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
40700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4072a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
40730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4074a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4075a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
40790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
40800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
40810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
40830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
40840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
40850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40860cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
40879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
40880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
40890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
40909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
40919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
40920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
40930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
4094a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
40950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4096a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
40990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
41010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
41020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
41030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
41040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
41050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
41060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
41070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
4108df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
41099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4110df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
41119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
41129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
4113df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4114df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
4115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
4117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
41189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4119df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4120df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4121df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4122df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
4123df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
4124df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
4125df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
4126df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4127df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4128df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4129df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4130df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4131b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
4132b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4133b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
4134df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
4135b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
4136b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4137df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
4138df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4139df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
4140df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4142df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4143b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
4144b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
4145b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
4146b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
4147df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
4148df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4149df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
4150df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
4151df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
4153df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
4154df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4155df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4156df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
4157df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4158df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4159df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
41600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
4161df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
41629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4163df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4164df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
4165a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4166a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4167df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
41680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
4169df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
4170df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4171df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
4172a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4173a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
41749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
4175df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4176df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4177df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4178df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
4179df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
4180df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
41810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
4182df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4183df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4184df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
41850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
4186df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4187a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4188a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
4189df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4190df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4191df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
41929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4193df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4194a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4195df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
4196df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
4197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
4198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
4199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
4200df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4201df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4202df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4203f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
4204f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4205a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
4206df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
4207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4208df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
4209df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4210df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4211df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
42120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
42130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
42140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
4215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
42169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
4217df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4218df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
4219df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
4220a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4221a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4222f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
4223df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
4224df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
4225df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4226df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
4227a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
4228df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
4229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
4230df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4231df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
4232df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4233df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4234df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4235df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
4236df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
4237f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
4238a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
4239a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
42402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
4241df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
4242a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
4243a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
4244a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
4245a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
4246df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
4247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
4248a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4249df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4250df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
4251a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
4252df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
4253df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
4254df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
4255a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
4256df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
4257df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
4258df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4259df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
4260df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
4261df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
4262df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
4263df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
4264df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
4265df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
4266a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
4267df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
4268df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
4269df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
4270df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4271df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
4272df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
4273df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
42743bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
42753bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
42760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
42773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
42783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
42802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
42813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
42823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
42833bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
42857de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
42863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
42873bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
42883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
42893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
42902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
42912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
42922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
42932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
42942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
42952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
42962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
42972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
42982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
42992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
43062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
43072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
43092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
43102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
43112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
43122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
43132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
43142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
43152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
43162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
43172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
43182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
43192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
4320c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) {
4321df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  StartWiFi();
4322df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kPeer[] = "peer";
4323df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
4324df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
4325df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
4326df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
4327df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
4328df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4329df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4330df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSDiscover(kPeer));
4331df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSDiscover(kPeer));
4332df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4333df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
4334df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
4335df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
4336df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
4337df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
4338df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4339df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4340df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSSetup(kPeer));
4341df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSSetup(kPeer));
4342df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4343df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
4344df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kStatus[] = "peachy keen";
4345df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
4346df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return(kStatus))
4347df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
4348df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
4349df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4350df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4351df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ(kStatus, TDLSStatus(kPeer));
4352df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ("", TDLSStatus(kPeer));
4353df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4354df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
4355df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
4356df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
4357df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
4358df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
4359df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4360df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4361df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSTeardown(kPeer));
4362df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSTeardown(kPeer));
4363df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4364df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart}
4365df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
4366c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) {
4367c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  StartWiFi();
4368c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kPeer[] = "00:11:22:33:44:55";
43693c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  const char kPeerDummy[] = "66:77:88:99:aa:bb";
4370c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4371c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4372c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4373c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error));
4374c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
4375c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4376c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4377c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
4378c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
4379c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error));
4380c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // This is not a valid IP address nor is it a MAC address.
4381c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
4382c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
4383c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
4384c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kAddress[] = "192.168.1.1";
4385c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
4386c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
4387c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
4388c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // The provided IP address is not local.
4389c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
4390c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(false));
4391c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
4392c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
4393c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
4394c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
4395c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
4396c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
4397c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
4398c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
4399c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // If the MAC address of the peer is in the ARP cache, we should
4400c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // perform the TDLS operation on the resolved MAC.
4401c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const char kResolvedMac[] = "00:11:22:33:44:55";
4402c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const ByteString kMacBytes(
4403c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac));
4404c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
4405c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(true));
4406c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _))
4407c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true)));
4408c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(),
4409c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                TDLSDiscover(StrEq(kResolvedMac)));
4410c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
4411c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
4412c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
4413c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_TRUE(error.IsSuccess());
4414c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
4415c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4416c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
4417c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
4418c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // This is the same test as TDLSInterfaceFunctions above, but using the
4419c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // method called by the RPC adapter.
4420c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
4421c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
4422c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
4423c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
4424c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4425c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4426c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4427c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4428c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
4429c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
4430c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4431c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4432c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4433c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
4434c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
4435c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4436c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4437c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4438c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
4439c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
4440c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
4441c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
4442c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4443c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4444c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4445c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4446c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
4447c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
4448c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4449c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4450c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4451c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
4452c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
4453c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4454c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4455c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4456c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4457c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  const map<string, string> kTDLSStatusMap {
4458c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { "Baby, I don't care", kTDLSUnknownState },
4459c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState },
4460c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState },
4461c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState },
4462c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState },
4463c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  };
4464c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4465c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  for (const auto &it : kTDLSStatusMap) {
4466c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
4467c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart        .WillOnce(Return(it.first));
4468c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4469c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(it.second,
4470c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
4471c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
4472c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4473c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4474c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
44753c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // Status on a peer after discover response should return
44763c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // "Not Connected" till the cleanup timer expiry.
44773c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
44783c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return());
44793c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
44803c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist));
44813c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  {
44823c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    Error error;
44833c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
44843c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
44853c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    ReportTDLSDiscoverResponse(kPeer);
44863c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ(kTDLSDisconnectedState,
44873c898323878e95b40abcfc6c7a993555d4675323Roshan Pius              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
44883c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
44893c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    TimeoutTDLSDiscoverCleanupTimer();
44903c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
44913c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
44923c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
44933c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // Status on a peer after discover response should return
44943c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // "Not Existent" after the cleanup timer expires.
44953c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
44963c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return());
44973c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeerDummy)))
44983c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return());
44993c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
45003c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist));
45013c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeerDummy)))
45023c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist));
45033c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  {
45043c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    Error error;
45053c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
45063c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45073c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeerDummy,
45083c898323878e95b40abcfc6c7a993555d4675323Roshan Pius                                       &error));
45093c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45103c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    ReportTDLSDiscoverResponse(kPeer);
45113c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    TimeoutTDLSDiscoverCleanupTimer();
45123c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ(kTDLSNonexistentState,
45133c898323878e95b40abcfc6c7a993555d4675323Roshan Pius              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
45143c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ(kTDLSNonexistentState,
45153c898323878e95b40abcfc6c7a993555d4675323Roshan Pius              PerformTDLSOperation(kTDLSStatusOperation, kPeerDummy, &error));
45163c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45173c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
45183c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
45193c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
45203c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // Status on a peer without a discover response should return
45213c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // "Non Existent".
45223c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
45233c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return());
45243c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
45253c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist));
45263c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  {
45273c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    Error error;
45283c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
45293c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45303c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ(kTDLSNonexistentState,
45313c898323878e95b40abcfc6c7a993555d4675323Roshan Pius              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
45323c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45333c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    TimeoutTDLSDiscoverCleanupTimer();
45343c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
45353c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
45363c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
45373c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // Status on a peer without a discover request, but an unexpected discover
45383c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  // response should be "Non Existent".
45393c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeerDummy)))
45403c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return());
45413c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
45423c898323878e95b40abcfc6c7a993555d4675323Roshan Pius      .WillOnce(Return(WPASupplicant::kTDLSStatePeerDoesNotExist));
45433c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  {
45443c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    Error error;
45453c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeerDummy,
45463c898323878e95b40abcfc6c7a993555d4675323Roshan Pius                                       &error));
45473c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45483c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    ReportTDLSDiscoverResponse(kPeer);
45493c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_EQ(kTDLSNonexistentState,
45503c898323878e95b40abcfc6c7a993555d4675323Roshan Pius              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
45513c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    EXPECT_TRUE(error.IsSuccess());
45523c898323878e95b40abcfc6c7a993555d4675323Roshan Pius    TimeoutTDLSDiscoverCleanupTimer();
45533c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  }
45543c898323878e95b40abcfc6c7a993555d4675323Roshan Pius  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
45553c898323878e95b40abcfc6c7a993555d4675323Roshan Pius
4556c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
4557c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
4558c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
4559c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4560c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4561c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4562c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4563c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
4564c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
4565c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4566c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
4567c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
4568c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
4569c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
4570c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
4571c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
4572c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
4573c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
4574c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4575c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4576c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
4577c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
4578c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4579c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
4580c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
4581c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
4582c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
4583c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
4584c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
4585c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
45863946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
4587235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage new_wiphy_message;
4588235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  new_wiphy_message.InitFromNlmsg(
4589235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan      reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg),
4590235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan      NetlinkMessage::MessageContext());
45913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
4592235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, ParseWakeOnWiFiCapabilities(_));
4593235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(kNewWiphyNlMsg_WiphyIndex));
4594235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  GetAllScanFrequencies()->clear();
45953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
4596235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(arraysize(kNewWiphyNlMsg_UniqueFrequencies),
4597235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan            GetAllScanFrequencies()->size());
4598235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  for (uint16_t freq : kNewWiphyNlMsg_UniqueFrequencies) {
4599235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan    EXPECT_TRUE(GetAllScanFrequencies()->find(freq) !=
4600235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                GetAllScanFrequencies()->end());
4601235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  }
46023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
46033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
46043946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
46053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
46063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
46073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
46083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
46093946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
46103946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
46113946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
46123946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
46133c3c36a37a885d0a2e180998587af8390744f757Samuel TanTEST_F(WiFiMainTest, OnIPConfigUpdated_InvokesOnDHCPLeaseObtained) {
4614787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopedMockLog log;
4615787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4616787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
46174bf0b5ccd6d4efac04e14b51ac2fe60550222e3cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
4618787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv4 DHCP lease obtained")));
4619787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _));
4620787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
4621787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPConfigComplete();
4622787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4623787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("IPv6 configuration obtained")));
4624787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _));
4625787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ReportIPv6ConfigComplete();
4626787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
46273c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  // Do not call WakeOnWiFi::OnDHCPLeaseObtained if the IP config update was
46283c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  // triggered by a gateway ARP.
46293c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Gateway ARP received")));
46303c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnDHCPLeaseObtained(_, _)).Times(0);
46313c3c36a37a885d0a2e180998587af8390744f757Samuel Tan  ReportIPConfigCompleteGatewayArpReceived();
46323c3c36a37a885d0a2e180998587af8390744f757Samuel Tan
4633787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
4634787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4635787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4636787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4637787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnBeforeSuspend_CallsWakeOnWiFi) {
4638c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan  EXPECT_CALL(
4639c420dd27964a85c8dec8f09d9049287ccba5f95aSamuel Tan      *wake_on_wifi_,
4640d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan      OnBeforeSuspend(IsConnectedToCurrentService(), _, _, _, _, _, _));
4641787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnBeforeSuspend();
4642787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4643787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4644787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel TanTEST_F(WiFiMainTest, OnDarkResume_CallsWakeOnWiFi) {
4645787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  EXPECT_CALL(*wake_on_wifi_,
4646d70ecdf36c94516b71cca8212caeb71da8c63d02Samuel Tan              OnDarkResume(IsConnectedToCurrentService(), _, _, _, _, _));
4647787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan  OnDarkResume();
46483fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
46493fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
46503fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, RemoveSupplicantNetworks) {
46513fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  StartWiFi();
46523fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service1 = MakeMockService(kSecurity8021x);
46533fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service2 = MakeMockService(kSecurity8021x);
46543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId1[] = "/service/network/rpcid1";
46553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const char kNetworkRpcId2[] = "/service/network/rpcid2";
46563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ::DBus::Path path1(kNetworkRpcId1);
46573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ::DBus::Path path2(kNetworkRpcId2);
46583fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service1, kNetworkRpcId1);
46593fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetServiceNetworkRpcId(service2, kNetworkRpcId2);
46603fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_FALSE(RpcIdByServiceIsEmpty());
46613fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path1));
46623fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(path2));
46633fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  RemoveSupplicantNetworks();
46643fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(RpcIdByServiceIsEmpty());
46653fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
46663fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
46675d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScan_Idle) {
46685d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
46695d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  Device::ScanType scan_type = Device::kFullScan;
46705d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
46715d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
46725d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [full]")));
46735d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
46745d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
46755d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  scan_type = Device::kProgressiveScan;
46765d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
46775d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scan [progressive]")));
46785d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
46795d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan}
46805d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan
46813fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel TanTEST_F(WiFiMainTest, InitiateScan_NotIdle) {
46823fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  const Device::ScanType scan_type = Device::kFullScan;
46833fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
46843fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
46853fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(1);
46863fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
46873fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  SetPendingService(service);
46883fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
46893fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
46903fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(
46913fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      log,
46923fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
46935d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScan(scan_type);
46943fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
46953fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
46963fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
46973fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
46985d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_Idle) {
46995d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
47004b8436a5136baa1716ca6a1013e2a4ad38ad2437Samuel Tan  StartWiFi();
47015d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
47023fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ASSERT_TRUE(wifi()->IsIdle());
47035d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
47045d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
47055d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
47065d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _));
47075d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
47085d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
47095d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_TRUE(manager()->suppress_autoconnect());
47103fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
47113fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
47125d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, InitiateScanInDarkResume_NotIdle) {
47135d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
47143fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  ScopedMockLog log;
47155d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
47165d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  SetPendingService(service);
47175d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  manager()->set_suppress_autoconnect(false);
47185d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(wifi()->IsIdle());
47193fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
47205d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(
47215d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      log,
47225d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      Log(_, _, HasSubstr("skipping scan, already connecting or connected.")));
47235d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(netlink_manager_,
47245d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
47255d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                                  TriggerScanMessage::kCommand),
47265d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan                                 _, _, _)).Times(0);
47275d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_)).Times(0);
47285d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  InitiateScanInDarkResume(freqs);
47295d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_FALSE(manager()->suppress_autoconnect());
47303fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan}
47313fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan
47325d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_NoResults) {
4733381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  ScopedMockLog log;
47345d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
47355d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
47365d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs;
4737381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan  EXPECT_CALL(netlink_manager_,
4738381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4739381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                                  TriggerScanMessage::kCommand),
4740381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan                                 _, _, _));
47415d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
47425d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
47435d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(0);
47445d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
47455d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
47465d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4747381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan}
4748381a0bb9927ded7963004fcd6793a77a3fca327bSamuel Tan
47495d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel TanTEST_F(WiFiMainTest, TriggerPassiveScan_HasResults) {
47505d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopedMockLog log;
47515d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
47525d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(3);
47535d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  const WiFi::FreqSet freqs = {1};
47543fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan  EXPECT_CALL(netlink_manager_,
47553fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan              SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
47563fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                                  TriggerScanMessage::kCommand),
47573fc8dae6b16f31cdc6e2b0733a5df85442ea26ecSamuel Tan                                 _, _, _));
47585d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
47595d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  EXPECT_CALL(log, Log(_, _, HasSubstr("Scanning on specific channels")))
47605d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan      .Times(1);
47615d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  TriggerPassiveScan(freqs);
47625d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
47635d0b8076eee13cd9b3de1c62f982ef0dc430260cSamuel Tan  ScopeLogger::GetInstance()->set_verbose_level(0);
4764787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan}
4765787a1cebf2452c14bf392ab99902e686ea4a6fb4Samuel Tan
4766050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul StewartTEST_F(WiFiMainTest, PendingScanEvents) {
4767050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // This test essentially performs ReportBSS(), but ensures that the
4768050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  // WiFi object successfully dispatches events in order.
4769050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  StartWiFi();
4770050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4771050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss0",
4772050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid0", "00:00:00:00:00:00", 0, 0,
4773050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4774050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4775050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss1",
4776050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid1", "00:00:00:00:00:01", 0, 0,
4777050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4778050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSRemoved("bss0");
4779050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  BSSAdded(
4780050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      "bss2",
4781050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      CreateBSSProperties("ssid2", "00:00:00:00:00:02", 0, 0,
4782050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart                          kNetworkModeInfrastructure));
4783050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4784050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpoint("ssid0", "00:00:00:00:00:00");
4785050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
4786050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
4787050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4788050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  InSequence seq;
4789050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0)));
4790050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1)));
4791050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  WiFiServiceRefPtr null_service;
4792050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(ap0)))
4793050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart      .WillOnce(Return(null_service));
4794050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2)));
4795050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  dispatcher_.DispatchPendingEvents();
4796050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
4797050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4798050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
4799050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart  EXPECT_EQ(2, endpoints_by_rpcid.size());
4800050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart}
4801050c073a14d89a426f3e5cfa09ec11d0f12e7757Paul Stewart
4802235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Success) {
4803235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Verify that the wiphy index in kNewWiphyNlMsg is parsed, and that the flag
4804235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // for having the wiphy index is set by ParseWiphyIndex.
4805235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), WiFi::kDefaultWiphyIndex);
4806235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
4807235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kNewWiphyNlMsg),
4808235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                    NetlinkMessage::MessageContext());
4809235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_TRUE(ParseWiphyIndex(msg));
4810235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_EQ(GetWiphyIndex(), kNewWiphyNlMsg_WiphyIndex);
4811235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4812235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4813235dcec779704b782f0608421d890fe6d183e7ccSamuel TanTEST_F(WiFiMainTest, ParseWiphyIndex_Failure) {
4814235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  ScopedMockLog log;
4815235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // Change the NL80211_ATTR_WIPHY U32 attribute to the NL80211_ATTR_WIPHY_FREQ
4816235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // U32 attribute, so that this message no longer contains a wiphy_index to be
4817235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  // parsed.
4818235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  NewWiphyMessage msg;
4819235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  uint8_t message_memory[sizeof(kNewWiphyNlMsg)];
4820235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  memcpy(message_memory, kNewWiphyNlMsg, sizeof(kNewWiphyNlMsg));
4821235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  struct nlattr *nl80211_attr_wiphy = reinterpret_cast<struct nlattr *>(
4822235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan      &message_memory[kNewWiphyNlMsg_Nl80211AttrWiphyOffset]);
4823235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  nl80211_attr_wiphy->nla_type = NL80211_ATTR_WIPHY_FREQ;
4824235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(message_memory),
4825235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                    NetlinkMessage::MessageContext());
4826235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4827235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
4828235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan                       "NL80211_CMD_NEW_WIPHY had no NL80211_ATTR_WIPHY"));
4829235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_FALSE(ParseWiphyIndex(msg));
4830235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan  EXPECT_CALL(*wake_on_wifi_, OnWiphyIndexReceived(_)).Times(0);
4831235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan}
4832235dcec779704b782f0608421d890fe6d183e7ccSamuel Tan
4833d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_ActiveScan) {
4834d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4835d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
4836d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kActiveScanTriggerNlMsg),
4837d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan                    NetlinkMessage::MessageContext());
4838d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(true));
4839d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4840d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4841d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4842d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel TanTEST_F(WiFiMainTest, OnScanStarted_PassiveScan) {
4843d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  SetWiphyIndex(kScanTriggerMsgWiphyIndex);
4844d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  TriggerScanMessage msg;
4845d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  msg.InitFromNlmsg(
4846d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan      reinterpret_cast<const nlmsghdr *>(kPassiveScanTriggerNlMsg),
4847d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan      NetlinkMessage::MessageContext());
4848d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  EXPECT_CALL(*wake_on_wifi_, OnScanStarted(false));
4849d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan  OnScanStarted(msg);
4850d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan}
4851d1bec5d563afc9074a1875e2302d5ecf54c95f95Samuel Tan
4852853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4853