wifi_unittest.cc revision 0afd90f73a4a22c7d9d144d8fe5de66b30632e48
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
5853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/wifi.h"
6853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
7f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h>
85c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h>  // Needs typedefs from sys/socket.h.
95a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <netinet/ether.h>
105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <sys/socket.h>
11f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1611c213f3cf64f27a0e42ee6da95e98bd1d4b3202Ben Chan#include <base/files/file_util.h>
177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h>
18dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.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"
308ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
31a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan#include "shill/ip_address.h"
32397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h"
337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
34b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
35853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
37084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h"
38853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
39c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
41f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
4211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
43e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
44687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h"
453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
46cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/mock_mac80211_monitor.h"
482ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
493426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
50bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h"
5110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
52af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h"
535c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h"
55a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
56b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
57735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h"
583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
59835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
615c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
623c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h"
65dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/nl80211_attribute.h"
675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h"
68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h"
7085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
71af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan#include "shill/wake_on_wifi.h"
733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
75ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
770e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
78a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
79853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
805f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set;
81853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
853c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
87a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
88cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
91b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
92549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
98dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
99d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
10011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref;
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
102af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew;
103ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
104ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
106a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
108853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
1093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
1108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
120c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234;
121125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhuconst char kSupplicantNameOwner[] = "9999";
1225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
1245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
126853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
1273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
1280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      : metrics_(nullptr),
1293946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        device_(
1303946da840142cd386d628c0e879459f8976bd86dmukesh agrawal            new WiFi(control_interface(), dispatcher(), &metrics_,
1313946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                     manager(), "wifi", "", kInterfaceIndex)) {
132853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
1333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
134853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
135853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
1363946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMetrics metrics_;
1378abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
138853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
139853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
141f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(device_->store().Contains(kNameProperty));
142de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
143853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
144853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1456bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
146a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
147a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
149de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
150f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanSignalThresholdProperty,
151a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
152a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
153a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
154a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
155a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1566bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
157f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kScanIntervalProperty,
1586bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1596bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
160a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
161853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
162a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
163a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1646bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
165f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                          kScanningProperty,
1666bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1676bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
168bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
1699d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
170a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
171853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1746bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
176f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
1774d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1780654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
1794d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1804d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1814d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1846bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
186f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
1874d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1924a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
1948abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
198e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
199e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
200f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
2014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
2020654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
2038abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2048abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
2056bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
2068abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
207f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty,
208f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn),
2098abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
2100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
211e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
212f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
2130654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
2148abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2158abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
216f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      device_->mutable_store(), kBgscanMethodProperty, &error));
217e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
218f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
2194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
2204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
2218abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
2228abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2233c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
2243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
2253c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
2263c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
2273c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
2283c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
2293c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
231e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
233bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  explicit WiFiObjectTest(EventDispatcher *dispatcher)
234e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
2350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        metrics_(nullptr),
2360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        manager_(&control_interface_, nullptr, &metrics_, &glib_),
237e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
238626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
239e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2403426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
241626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
242626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
243626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
244c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                       kInterfaceIndex)),
2453c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
2463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        mac80211_monitor_(
2473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal            new StrictMock<MockMac80211Monitor>(
2483946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                dispatcher, kDeviceName, WiFi::kStuckQueueLengthThreshold,
2493946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                base::Closure(), &metrics_)),
250084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_service_proxy_(new MockDBusServiceProxy()),
251dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
252af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()),
253af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)),
254084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_manager_(new DBusManager()),
2550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
256735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
2573c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
258af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan            new NiceMock<MockSupplicantInterfaceProxy>()) {
2593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->mac80211_monitor_.reset(mac80211_monitor_);
2605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
261e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan    ::testing::DefaultValue<::DBus::Path>::Set("/default/path");
262c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, UpdateConnectedState(_))
2643946da840142cd386d628c0e879459f8976bd86dmukesh agrawal        .Times(AnyNumber());
2653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
266b108318d9554032feee1249d51c961e4f90f4561Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _))
267af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(Return(dhcp_config_));
268af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true));
269af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan
270af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateDBusServiceProxy())
271af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_));
272af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _))
273af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_));
274af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _))
275af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_));
276af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _))
277af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_));
278af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _))
279af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>());
280318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
281ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
283735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
284735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
2852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2875c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
288bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
2895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
2900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
2915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
2935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
2945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
2955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
2965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
2973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2985c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2995c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
3003ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
3013ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
302d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
303084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->proxy_factory_ = &proxy_factory_;
304ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
3055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
3065c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
3073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
3082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
309b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
3105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
3115c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
3125c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
3133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
3140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        .WillRepeatedly(Return(nullptr));
3150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SelectService(nullptr);
316b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
317b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
318b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
3193946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
3200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->proxy_factory_ = nullptr;
3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
3223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
3233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
3240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->Stop(nullptr, ResultCallback());
3250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->set_dhcp_provider(nullptr);
326084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Stop();
3270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    dbus_manager_->proxy_factory_ = nullptr;
3283ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
3293ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
330d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
331f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
332f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
333549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
334549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
3353946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    EXPECT_CALL(*mac80211_monitor_, Stop());
3360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(false);  // Stop(nullptr, ResultCallback());
337549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
338549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
339c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
340c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
341c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
342c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
34317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
3440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    SetPendingService(nullptr);
34517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
346c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
3485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
3575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
3585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
3635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
3645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
3675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
3685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    set<uint16_t> available_frequencies;
3695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
3705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
3715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
3725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
3735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
3745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
3755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
3775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
379f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
3800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                        nullptr);
3815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
3825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
3855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
3865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
3875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3897347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  void OnTriggerScanResponse(const Nl80211Message &message) {
3905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
3915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
393b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
394b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
395b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    const char *reason) {
396b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
397b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
398b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
4000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
4010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
4020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
4030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
4047fab89734d88724a288e96a9996b15548c5294c7Ben Chan  void SetRoamThresholdMember(uint16_t threshold) {
405227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    wifi_->roam_threshold_db_ = threshold;
406227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
407227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
4087fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetRoamThreshold(uint16_t threshold) {
409227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->SetRoamThreshold(threshold, nullptr);
410227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
411227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
4127fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t GetRoamThreshold() const {
413227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->GetRoamThreshold(nullptr);
414227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
415227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
4163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
4177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
4187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
4192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Simulate the course of events when the last endpoint of a service is
4203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
4213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
422bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
423bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
424bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
425bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
426bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
427bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
428bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        const WiFiEndpointConstRefPtr &endpoint) {
429bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
430bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
431bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
439bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      const WiFiServiceRefPtr &service) {
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
442b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
443b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
444b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
456a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      *ssid = StringPrintf("ssid%d", bss_counter_);
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
458a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *path = StringPrintf("/interface/bss%d", bss_counter_);
459a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_);
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
4710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan        &proxy_factory_, nullptr, ssid, bssid, mode, 0, 0);
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
482f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kModeManaged,
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
4907fab89734d88724a288e96a9996b15548c5294c7Ben Chan                                         uint16_t frequency,
4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
5167fab89734d88724a288e96a9996b15548c5294c7Ben Chan      uint16_t frequency,
5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
533a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    wifi_->ConnectTo(service);
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
538d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  void InitiateDisconnectIfActive(WiFiServiceRefPtr service) {
539d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein    wifi_->DisconnectFromIfActive(service);
540d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  }
5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
549a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    if (!network_path.empty()) {
550a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
551a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
552a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart          .WillOnce(Return(network_path));
553a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
554a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
588bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
589b108318d9554032feee1249d51c961e4f90f4561Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
5903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
591a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
5920654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
5933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5943c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
598d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
599b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
600b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
601b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
6032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
6040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kFullScan, nullptr, __func__);
6052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
6060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kProgressiveScan, nullptr, __func__);
6072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
608c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
6091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
6101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
6111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
612bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
613bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
614bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
6153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
616165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
6191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
6201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6212b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
6222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
6232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
6241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
625446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
626446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
6272ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  const ServiceRefPtr &GetSelectedService() {
6282ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal    return wifi_->selected_service();
6292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  }
6307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const string &GetSupplicantBSS() {
6317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
6327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void SetSupplicantBSS(const string &bss) {
6347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
6357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
6371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
639b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
643e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
6443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
6453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
6498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
6508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
6533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
6607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
6617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
6627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
663835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
664835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
665835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6660427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
6670427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
6680427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
669381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
670381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
671381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
672261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
6733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
6743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
6753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
6777fab89734d88724a288e96a9996b15548c5294c7Ben Chan                 uint16_t frequency,
6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
679c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
680c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart    wifi_->OnIPConfigUpdated(dhcp_config_);
681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
682f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
683f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
684f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
685f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
686f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
687f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
688f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
689f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
690f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
6913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
6925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
6935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
699dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
7003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
7021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
7031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
7047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
7057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
7067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
7075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
7085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
7095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
7107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
7117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
7127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
7137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) {
7147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
7157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
716baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
7170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetLinkStatistics(nullptr);
718baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
719cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
720df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
721cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
72211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
72311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      const WiFiServiceRefPtr &service, const string &rpcid) {
72411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
72511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
726bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
727bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
729e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
7300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetScanInterval(nullptr);
731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
7322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
734a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
735a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
736a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
737a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
738a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
739a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
741a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
742a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
743a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
745a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
7465412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _));
747a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
748125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    StringCallback supplicant_name_owner_callback;
749125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
750125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      EXPECT_CALL(*dbus_service_proxy_.get(),
751125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                  GetNameOwner(WPASupplicant::kDBusAddr, _, _, _))
752125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu          .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated),
753125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                          SaveArg<2>(&supplicant_name_owner_callback)));
754125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu
755084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Start();
7562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
7570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(true);  // Start(nullptr, ResultCallback());
758125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
759125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      // Mimick the callback from |dbus_service_proxy_->GetNameOwner|.
760125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error());
7613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7622b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
7632b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
7642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7652f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
7662f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
7672f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7682f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
7692f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
7702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
772084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
7732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
7742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
776084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
7782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
7802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
7812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
782687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
783687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
784687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
785687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  void SetIPConfig(const IPConfigRefPtr &ipconfig) {
786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
7884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
792f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
7934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
7974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
7984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
7994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
8004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
8014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
802bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
803bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
80510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
806db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
807db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
808db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
809db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
810e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
811e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
812e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
813e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
8141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
8151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
8161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
8191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
8201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
8233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
8243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
826bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
8271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
8281369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
8291369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
8301369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
8313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
8323c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
8333c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
8357fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanShortInterval(const uint16_t &interval, Error *error) {
836bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
837bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
838bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
8397fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) {
840bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
841bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
842bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSDiscover(const string &peer) {
844df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSDiscover(peer);
845df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
846df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
847df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSSetup(const string &peer) {
848df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSSetup(peer);
849df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
850df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  string TDLSStatus(const string &peer) {
852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSStatus(peer);
853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSTeardown(const string &peer) {
856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSTeardown(peer);
857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
859c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  string PerformTDLSOperation(const string &operation,
860c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              const string &peer,
861c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              Error *error) {
862c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
863c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
864c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
865df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
866df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
867df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
868df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
8693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  void OnNewWiphy(const Nl80211Message &new_wiphy_message) {
8703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
8713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
8723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
87310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
87410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
87510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
87610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
87785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
87885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
87985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
88085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
8813239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
8823239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
8833239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
884d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
885d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
886d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
887d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
888d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
889d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
890d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
891d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
892d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
8933239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
8943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
8953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
8963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
897af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory *proxy_factory() {
898b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
899b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
900b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
9013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
9023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
9033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor() {
9063946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
9073946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
9083946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
909397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddressStore *GetWakeOnPacketConnections() {
910397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    return &wifi_->wake_on_packet_connections_;
911397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
912397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
913397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  int *GetNumSetWakeOnPacketRetries() {
914397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    return &wifi_->num_set_wake_on_packet_retries_;
915397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
916397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9175f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggers() {
9185f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    return &wifi_->wake_on_wifi_triggers_;
9195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  }
9205f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
9219c73d221484fbd719072261ff288373ce866693fSamuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggersSupported() {
9229c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_triggers_supported_;
9239c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9249c73d221484fbd719072261ff288373ce866693fSamuel Tan
9259c73d221484fbd719072261ff288373ce866693fSamuel Tan  size_t *GetWakeOnWiFiMaxPatterns() {
9269c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_max_patterns_;
9279c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9289c73d221484fbd719072261ff288373ce866693fSamuel Tan
929397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void AddWakeOnPacketConnection(const IPAddress &ip_endpoint, Error *error) {
930397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->AddWakeOnPacketConnection(ip_endpoint, error);
931397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
932397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
933397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint,
934397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                    Error *error) {
935397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error);
936397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
937397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
938397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveAllWakeOnPacketConnections(Error *error) {
939397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveAllWakeOnPacketConnections(error);
940397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
941397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
942397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RequestWakeOnPacketSettings() { wifi_->RequestWakeOnPacketSettings(); }
943397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void VerifyWakeOnWiFiSettings(const Nl80211Message &nl80211_message) {
9455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->VerifyWakeOnWiFiSettings(nl80211_message);
946397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
947397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void ApplyWakeOnWiFiSettings() {
9495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->ApplyWakeOnWiFiSettings();
950397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
951397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
952397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RetrySetWakeOnPacketConnections() {
953397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RetrySetWakeOnPacketConnections();
954397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
955397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
956e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
9575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
9585c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
9595c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
9603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
962dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
9633426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
964f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
9652ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
966c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
9693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
9703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor_;  // Owned by |wifi_|.
9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
9753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
976626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
9773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
9783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
979446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
980446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
9817fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
9823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
983084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  scoped_ptr<MockDBusServiceProxy> dbus_service_proxy_;
984dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
985b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
986f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
987f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
988084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  DBusManager *dbus_manager_;
989735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
990735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
991735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
9920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
993735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
994bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
9953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
9973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
998af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
9993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
10003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1005446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1006446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
10077fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
10083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
1010b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1011261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1012261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
10153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
10163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
10177fab89734d88724a288e96a9996b15548c5294c7Ben Chan                             uint16_t frequency,
10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
10193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
10203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
10273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1028a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
10293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
10303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
10323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
10333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
1035e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
10360654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
1037e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
10380654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
1039b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
10403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1046e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1047e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1048a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1051a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
10522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1053a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
10559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
10569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
10579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
10589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1060f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1061a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
10622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
10632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
10642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
10659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
10669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
10679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
10689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
10719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
10729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
10739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
10749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
10759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
10769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1083a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
10859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
10869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
10879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
10899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
10909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1095a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
10962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1097a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1098a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
10992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
11002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1101a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
11022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1103f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1104a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1105a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1108a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1109a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1111f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1117a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1119a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1122a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1125a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1135e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1136e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1137e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
11383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
11390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
11413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
11440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
11453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11472b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
11492b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11502b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1151227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1152227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1153227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1154227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1155227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1156227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1157227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1158227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1159227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1160227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1161227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1162227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1163227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1164227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1165227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1166227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1167227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1168227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1169227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
11702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
11710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
11740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1176227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
11842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
11850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
11869cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
11879cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
11889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
11899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
11909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
11919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
11922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11942b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
11950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
11980afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
12009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
12019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
12029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
12042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12062b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
12070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
12100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
12112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
12142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12182b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1225549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
12263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
12290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
1230549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1231549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1232c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1233549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1234549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1235549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
12363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
12373c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
12383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
12393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
12403c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
12413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1242549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1243549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
12440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1245549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1246549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
12475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
12523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
12533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
12543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1256b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
12573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
12593239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1260b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
12613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
12623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
12635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
12645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
12675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
12685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
12765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1278835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1280835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
12810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
12823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1283835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1284835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1285835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
12860427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
12870427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
12880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
12890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
12900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
12910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
12920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1293381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1294381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1295381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
12963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1297381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1298381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1299381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1300381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1301381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1303381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1304381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1305381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1306381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1307381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1308381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1309381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1310381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1311ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1312316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1313316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1314316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1315316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1316b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1317316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1318316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1319316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1320316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1321316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1322316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1323316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1324316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1325316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1326b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1327ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1328ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1329316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  Mock::VerifyAndClearExpectations(service);
1330316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1331316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1332316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1333316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
1334b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false))
1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1337ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1338ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1339381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1340381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1342381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1343381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1344381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1345381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1346381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1347381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1348381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1349381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1350381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1351381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1353381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1354381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1355381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1356381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1357381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1358381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1359381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1360381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
13615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
13625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
13633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
13643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
13653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
13663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
13682b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
13703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13723239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
13733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
13765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
13775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
13785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
13795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
13805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
13815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
13825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
13835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
13865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
13883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
13893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
13942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
13952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
13963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1400f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1405c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1407c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1408c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1419c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1420c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1423c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
14260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1427c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
14283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1429c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1432c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1435c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1440c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1441c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1447c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1448c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
14495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
14502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
14512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
14522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1454f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
14595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
14810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
14835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
14842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
15025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1504ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1505ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15075c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1508ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1509ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
15105f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15115f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15122f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1513ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1514ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1515ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
15175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15245f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
15270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
15280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
15290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
15345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1536ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1537ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1539ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1540ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15415f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15432f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1544ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1545ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1546ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
15485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
15575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
15615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1563ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1564ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
15670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
15683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
15705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15713ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1573ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1575ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1576ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1577ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
15795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
15840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
15855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
15865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
15875f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
15905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1591df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
15925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
15935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
15983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1599e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
16003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1601e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
16023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1603e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
16043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1605e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
16067fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
1607e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1608e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1609e41a72d0737488d561a4158019409d5785dad61bThieu Le
1610e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1611e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1612e41a72d0737488d561a4158019409d5785dad61bThieu Le
1613e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1614e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1615e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1616e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1617e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1618e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1619e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1620e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1621e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1622e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1623e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1624e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
16253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
16283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
16303c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
16313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
16323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
16333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
16343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
16433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
16443c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1646b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
16470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
1648e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1649b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1650e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1651e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
16528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
16558a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16643c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16658a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1667261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1668261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1669261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1670261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
16793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1681835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1682835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
16833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
16840afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
1685835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1686835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1688835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
16920654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1693835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1694835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1695a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
1696a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
16973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
16983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1699835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1700835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1701835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
17020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
17030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
17050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17084943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
17094943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17104943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
17124943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
17130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17144943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
17154943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17164943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
17174943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
17184943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
17190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17204943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
17214943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17224943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
17233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
17260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
17300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
17320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
17333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
17340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
17373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
17383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
17393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
17410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
17423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
17463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
17500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
17520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
17530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
17550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17562b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
17570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
17603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
17613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
17620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17644943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
17680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
17690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1770835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1771835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1772af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
1773af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
1774af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
1775af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
1776af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
1777835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1778735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
17804943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
17814943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17824943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
17830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
17844943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17854943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
17864943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17874943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
17884943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
17894943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ::DBus::Path kPath("/fake/path");
17900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
17914943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17924943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
17934943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17944943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
17954943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
17964943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
17974943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17984943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
17994943822214f823c2437aa32b0376414b3e60388dPeter Qiu  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
18004943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
18014943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
18024943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
18034943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
18044943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false));
18054943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
18064943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
18074943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
18084943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
18090654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1814c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
18153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
18170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1819c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
18203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1821c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1822c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1823c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1824c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
18250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
1827c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1828c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
18290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
18300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
18314943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
18334943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(),
18340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
18350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
18380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
18390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18422b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
18434943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18444943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
18454943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
18464943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18472b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
18482b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
18491aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
18501aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
18511aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  DBus::Path kPath("/fake/path");
18520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18531aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18541aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
18551aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
18561aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
18571aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18581aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18591aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
18601aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
18611aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18621aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
18631aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
18640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
18661aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18671aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
18681aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18691aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
18701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
1871d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
1872d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1873d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1875d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1876d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1877d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1878d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1879d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1880d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1881d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
1882d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1883d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1884d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1885d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1886d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1887d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1888d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1889d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1890d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
1891d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1892d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18930afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1894d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1895d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(),
18960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1897d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1898d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1899d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1900d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1902d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
1904d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(0);
1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1909d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1910d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1912d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1913d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19170afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
19180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1923d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
1926d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(1);
1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1934d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
193717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
19389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
193917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
194017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
19419f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
19429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
194344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
194444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
194517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
194617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
194717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
19480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
19490d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
19500d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")))
195117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
195217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
195317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
195433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
195517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
19560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
195744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
1958a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
195944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
1960a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
1961a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1962a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
19630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
19650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
196617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
19670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
196833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
196933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
197017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
19710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
19720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
19730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
197417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
197517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
197617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
19772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
19782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
19792b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
19810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
19822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
19832b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
198417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
198517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
19860d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
19870d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
19880d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")));
198917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
199017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
199117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
199217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
19933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
19940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
19950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
19960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
19970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
19980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
19993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
20000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
20013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
20020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
20063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
20080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
20100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
20110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
20120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
20130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
20143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
20150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
20170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20195c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2020c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
20213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
20223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
20230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
20243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
20250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
20263c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
20280afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
20300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2032c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2033b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2034c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
20355c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
20365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2037549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
20410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
20423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
20433c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2048549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
20490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2050549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2051549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2052446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
20550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
20571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20580654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20600654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
20611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2064446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
20651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20660654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2072446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2073446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
20745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2075a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
20760654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
2077ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
2078ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2079ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2080ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2081ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
2082ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
2083ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
2084ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2085ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2086ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2087ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
20883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
20893c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
20903c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
20923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
20930654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
20943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
2095ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2096ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
20975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
20985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
20993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
21003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
21013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
21023c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
21043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
21055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
21065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
21093c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
21135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
21185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
21195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
21205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2122ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
21235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21245412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
21255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
21295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
21335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
21345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21485412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2149ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2150ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2151ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2152fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2153fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2154fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2155fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2156fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
21573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2159fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2160fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2161fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
21625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
2163fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2164fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2165fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2166fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
21671e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
21681e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
21691e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
21701e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
21711e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
21721e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
21731e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal      .WillOnce(Throw(DBus::Error("don't care", "don't care")));
21741e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
21751e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
21761e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
21771e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
21781e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
21795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
21805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
21815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
21825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
21835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
21859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
21867de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
21875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
21885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
21902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
21915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
21935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
21945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2196f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2197df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2198df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2199df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2200f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
22015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
22025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
22065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
22075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
22085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
22145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
22155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
22165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
221744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
221844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
221944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
222044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
22229f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
22262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
22277de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
22285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
22335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
22345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
22355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
22365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
22400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
22435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2244a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2245a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
22480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
22520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
22542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
22552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
22562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
22575412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
22582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
22595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
22612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
22635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
22640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
22670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
22682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
22702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
22710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
22757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
22767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
22777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
22787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
22797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
22800654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
22810654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
22827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
22837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
22847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
22857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
22867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
22877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2288f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
22897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
22907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
22910654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
22927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
22937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
22947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2295d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
22967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
22977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
22987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
22997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
23007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
2301b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2302d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
23037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
23047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2305f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2306bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2307bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2308bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
23110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
23120654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
23163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
23173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
23187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2320a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
2321a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2322a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2323a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2324f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2325a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2326a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2327a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2328a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2329a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2330a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2331a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2332a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2333a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2334a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2335a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2336a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2337a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2338a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2339a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2340f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2341a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23420654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
23430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2344a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2345a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2346a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2347a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2348a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2349a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
23542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23560654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
23570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2358a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
23590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23621590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
23631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
23643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
23653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
23660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr);
23671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
23684943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
23690654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
23700afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
23710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2372687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
23731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
23741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
23751590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
23761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
23773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
23780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
23793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
23803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
23810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
23823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
23831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2384c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2385c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2386c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2387c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
23883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
23893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
23903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2391bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2392a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
23930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2395687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
23963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
23973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
23981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
23991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2400e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2401e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
24020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
24030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
24040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
24053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
24060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
24093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
24113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2412687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
24130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2414687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2415687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2416687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2417687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2418687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2419687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2420687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2421687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2422687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2423687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  Mock::VerifyAndClearExpectations(ipconfig);
2424687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24254eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
24264eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
24278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
24288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
24300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
24328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
24340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
24360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24388a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
243949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
244049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
244149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ::DBus::Path bss_path;
244249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
244349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
24440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, &bss_path));
244549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
24460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
244749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
244849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
244949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
245049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
245149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
245249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
245349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
245449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
245549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
24560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
24570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
245849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
245949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
246049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
24618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
24628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
24643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
24650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
24678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
24694a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
24700654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
24719d97b7deda3ae604d718873207a951f62d418b34Paul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) &&
24720654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
24734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
24744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
24754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
24764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
24773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
24780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2479a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
24810654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
24824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
24834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
24844d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
24854a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
24864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
24873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
24880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2489a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
24903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
24914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
24924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
24934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
24944a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
24954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2496f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
24974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
24984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
24994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
25013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25030654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
25044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
25074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
25083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
25093c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25103c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25140654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
25204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
25250654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
25264a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
25394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25415c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
25425c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
25430654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
25445c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
25453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25465c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
25473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25485c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
25495c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
25505c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
25510654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25525c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
25535c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
25554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2556c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2557c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
25583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
25590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
2560c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2561c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2562c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2563c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2564c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2565c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
2566c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
2567c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2568c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2569c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2570c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
25713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
25720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
25738f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2574c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
25758f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
25768f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
25770654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
25785519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
25793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
25803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
25813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
25828f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
25838f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
25845519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
25855519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
25863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
25873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
25883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
25890654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2591c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2592b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2593b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2594b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2595b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2596b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2597b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2598b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2599b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2600b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2601b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2602b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2603b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2604b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2605b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2606b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2607b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2608b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
26093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
26100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
26110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
26123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2613b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2614b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2615b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2616b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2617b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
26185c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
26195c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
26205c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
26215c05b2920be742d518829972127172481722058dmukesh agrawal
26225c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
26235c05b2920be742d518829972127172481722058dmukesh agrawal
26245c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
26255c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
26265c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
26273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
26285c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
26295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
26302f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
26315c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
26325c05b2920be742d518829972127172481722058dmukesh agrawal}
26335c05b2920be742d518829972127172481722058dmukesh agrawal
26345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
26355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2636b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2637b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2638b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2639b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2640b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26427de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
26430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2644b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2645b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2646b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2647b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2648b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2649b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
26515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
26525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
26545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
26555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
26560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
26585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
26595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
26605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
26625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2664b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2665b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2666b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2667b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2669b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2670b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2671b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2672b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
26735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2674b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2675b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2676b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2677b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2678b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2679b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2680b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2681b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
26823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
26830afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr);
2684b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2685b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
26885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2689b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2690b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2691b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2692b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2693b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
2700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2703b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
27215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
27225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
27235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
27255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
27265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
27275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
2728a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
27315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
27325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
27335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
27345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
27365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
27410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2742df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
27433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
27443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
27453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
2746a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
27495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
27500654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2754b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2755b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2756b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2759df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
27603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
27620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2765b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
27673c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
27682ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
27692ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
27703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
27712ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
27723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
27733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
27743c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
27752ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
27762ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
27772ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
27783c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
27793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
2780daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
27813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
27822ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
27832ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
27842ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
27852ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
27862ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
27872ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
27882ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
27892ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
27902ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
27912ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
27922ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
27932ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
27943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2795daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
2796daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1);
27973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
27983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
27993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
28003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
2801cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2802f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2803bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
28040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2805cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2806cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2807bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
2808f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
28090654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2810bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2811bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
2812bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
28130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
28141369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2815bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
28161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2817cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2818cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2819f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
2820f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
2821f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
2822f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
2823a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
2824f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
2825f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
2826f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2827f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
2828f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
2829f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
2830f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2831f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2832b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2833f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
2834f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
2835f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2836f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2837f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2838f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2839f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
2840f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2841f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2842f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
2843f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
2844f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
2845f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
2846f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2847f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2848f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
2849f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
2850f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2851f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2852f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
2853f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
2854f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
28550d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
28560d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
28570d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2858f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2859f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2860f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2861f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
2862f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
2863f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2864f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
28650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
28660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
28670d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2868f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2869f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2870f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2871f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
2872f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
2873f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
28760d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
28770d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
28780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    StrEq("OnIPConfigFailure")));
2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2880f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
2881f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
28821369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
2883f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
2884735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2885735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2886735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2887735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2888735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2889bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
28900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2891bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2892bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2893bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
28941369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2895bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
28961369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2897bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2898bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2899bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
29000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2901bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2902bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2903bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2904bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
29050afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
29061369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29071369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29081369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2909f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
2910cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
29110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2912cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2913a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
2914bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2915f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
29164943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2917735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2918cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2919f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
29200654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
29211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29231369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
2924f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
29251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
29261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2927735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2928735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
29294943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2930735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2931735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2932735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2933735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2934735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2935bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2936735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
29371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
293839a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
2939735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
29400654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2941cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2942cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2943e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2944e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
29451aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2946e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
29471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2948e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2949e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2950e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2951e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2952e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2953e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2954e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
29551aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2956e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2957e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2958e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2959e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2960e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
2961e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
2962e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
2963e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
2964e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
2965e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
2966e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
2967e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
2968e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2969e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
2970e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2971e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
2972e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
2973e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2974e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2975e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
2976e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2977e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
2978e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2980e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2981e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
2982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
2983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
2984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
2985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
29871aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
29880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
2989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
2990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
2991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2994e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
2995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
2999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
30071aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
30081aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
30110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
30121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
30191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
30251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
30331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
30351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30367cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
30377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
30417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
30427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
30430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
30447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
30457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30475412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
30487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
30497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
30507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
30527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
30547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
30577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
30587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
30597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
30637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
30647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
30657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
30667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
30677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
30697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
30727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
30737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
30745412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
30757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
30777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
30787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
30817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
30827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
30837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3084baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3085baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3086baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3087baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
30887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
30897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
30907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
30917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
30927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
30937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
30947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
30957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
30967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
30977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
30987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3099baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3101baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3102baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3103baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3104baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3105baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3106baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3107baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3108baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3109baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3110baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3111baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3112baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3113baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3114baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3115baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3116baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3117baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3118baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3119baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3120baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3121baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3122baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3123baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3124baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3125baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3126baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3127baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3128baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3129baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3130baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3131baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3132baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3133baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3134baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3135baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3136baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3137baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3138baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3139baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3140baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3141baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3142baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3143baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3144baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3145baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3146baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
31497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
31507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31517cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
31527cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
31538e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
31547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
31557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
31567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3157baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3158baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3159baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3160baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3161baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3163baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3177baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3178baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3179baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3180baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3181baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3184e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3185e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3186e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3187e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3188e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3189e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3190e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3191e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3192e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3193e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3194e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3195e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3196e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3197e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3198e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3199e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3200e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3201e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3202e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3203e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3204e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3205e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3206e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3207e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3208e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3209e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3210e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3211e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3212e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3213e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3214e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3215e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3216e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3217e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3218e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3219e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3220e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
32218e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
32228e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3223e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3224e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3225e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3226e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3227e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3228e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
32297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
32307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3231bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3232f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3233bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3234bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3235bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3236bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3237bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
3238bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3239bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3240bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3241bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3242bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3243bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3244bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3245bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
32467fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
32470654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
3248bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3249bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3250bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3251bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3252bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3253bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3254bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
32550654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
3256bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
3257bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3258bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3259db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3260db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3261db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
326211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3263db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3264db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3265735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3266735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3267735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3268735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3269db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3270db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3271db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3272f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3273db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3274735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3275db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3276735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3277735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
3278735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3279db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3280735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3281735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
32830d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
32840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
32850d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
3286735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
328711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
328811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  MockEapCredentials *eap = new MockEapCredentials();
328911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
329011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
329111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
329211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
329311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
329411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
329511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
329611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
329711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
32980d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
32990d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33000d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
330111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
330211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
330311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
330411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
330511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
330611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
330711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
330811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
33090d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
331011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
331111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
331211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
331311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
331411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3315bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3316bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3317c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3318c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3319c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3320c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3321c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3322c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3323c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3324c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3325c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3326c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3327c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3328c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
33296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
33306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
33316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
33326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
33336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
33347fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
33356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
33366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
33376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
33396d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
33406d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
33416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33426d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
33436d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
33456d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
33466d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
33476d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
33486d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
33496d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
33506d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
33516d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33526d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
33536d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
33546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
33556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
33566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
33576d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
33596d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
33606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
33616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
33626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
33636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
33646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
33657347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
33667347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
33676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33685581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
33695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
33705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
33715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
33725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
33735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
33745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
33755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
33765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
33775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
33785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
33795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
33800654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
33815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
33825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
33835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
33845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
33855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
33865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
33875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
33880654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
33890654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
33900654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
33910654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
33920654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
33930654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
33940654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
33950654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
33965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
33975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
33985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
33995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
34085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
34095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34100654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
34110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
34125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
34175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
34185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34190654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
34215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
34265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
34275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34280654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
34290654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
34355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
34365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
34385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
34415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
344250cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
344350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
344450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
344550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
344650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
3447bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
3448bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
3449bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
3450bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
3451bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3452bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
34537fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
3454bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3455bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
3456bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3457bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3458bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
3459bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3460bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3461bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3462bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
3463bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3464bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
34657fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
3466bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3467bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3468bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3469bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3470bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3471bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3472bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3473bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3474bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
3475bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3476bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3477bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
3478bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3479bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3480bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
3481bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
34820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
34830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
34840cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
34859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
34860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
3487a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3488a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3489a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3490a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3491a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
34920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
34930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
34947de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
34950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
34960cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
34970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
34980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
34990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35020cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
35039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
35040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35069f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
35079f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
35089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
35090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35100cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3511a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
35180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35250cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
35269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
35270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
35310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3533a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3535a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3537a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
35400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
3547df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
35489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3549df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
35509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
3552df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3553df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
3554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3555a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
3556a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
35579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3558df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3559df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3560df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3561df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
3562df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
3563df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
3564df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
3565df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3566df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3567df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3568df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3569df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3570b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
3571b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3572b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
3573df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
3574b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
3575b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3576df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
3577df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3578df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
3579df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3580a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3581df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3582b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
3583b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
3584b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
3585b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3586df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
3587df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3588df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3589df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
3590df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3591a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3592df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3593df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3594df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3595df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
3596df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3597df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3598df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
35990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
3600df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
36019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3602df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3603df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
3604a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3605a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3606df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
36070afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3608df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
3609df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3610df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
3611a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3612a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
36139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3614df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3615df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3616df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3617df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
3618df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
3619df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
36200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3621df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3622df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3623df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
36240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
3625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3626a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3627a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
3628df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3629df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3630df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
36319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3633a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
3636df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
3637df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
3638df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3640df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3642f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
3643f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3644a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
3645df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
3646df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
3648df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3649df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3650df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
36510afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
36520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
36530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
3654df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
36559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3656df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
3658df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
3659a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3660a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3661f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
3663df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3665df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
3666a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3670df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3672df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
3675df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
3676f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
3677a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
3678a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
36792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
3680df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
3681a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
3682a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3683a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3684a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3685df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
3686df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
3687a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
3690a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3691df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3692df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
3694a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3698df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
3699df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3700df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
3701df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
3705a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
3707df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3712df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
37133bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
37143bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
37150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
37163bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37173bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37183bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
37192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37203bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
37213bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
37223bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37233bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
37247de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
37253bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
37263bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37273bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
37283bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
37302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
37312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37322ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
37332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
37362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
37382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
37452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
37462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
37482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
37532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
3759c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) {
3760df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  StartWiFi();
3761df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kPeer[] = "peer";
3762df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3763df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3764df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3765df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3766df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3767df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3768df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3769df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSDiscover(kPeer));
3770df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSDiscover(kPeer));
3771df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3772df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3773df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3774df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3775df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3776df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3777df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3778df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3779df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSSetup(kPeer));
3780df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSSetup(kPeer));
3781df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3782df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3783df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kStatus[] = "peachy keen";
3784df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3785df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return(kStatus))
3786df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3787df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3788df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3789df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3790df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ(kStatus, TDLSStatus(kPeer));
3791df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ("", TDLSStatus(kPeer));
3792df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3793df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3794df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3795df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3796df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3797df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3798df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3799df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3800df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSTeardown(kPeer));
3801df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSTeardown(kPeer));
3802df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3803df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart}
3804df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3805c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) {
3806c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  StartWiFi();
3807c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kPeer[] = "00:11:22:33:44:55";
3808c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3809c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3810c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3811c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error));
3812c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3813c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3814c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3815c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3816c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3817c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error));
3818c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // This is not a valid IP address nor is it a MAC address.
3819c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3820c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3821c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3822c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kAddress[] = "192.168.1.1";
3823c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3824c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3825c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3826c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // The provided IP address is not local.
3827c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3828c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(false));
3829c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3830c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3831c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3832c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3833c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3834c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3835c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3836c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3837c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // If the MAC address of the peer is in the ARP cache, we should
3838c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // perform the TDLS operation on the resolved MAC.
3839c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const char kResolvedMac[] = "00:11:22:33:44:55";
3840c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const ByteString kMacBytes(
3841c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac));
3842c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3843c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(true));
3844c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _))
3845c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true)));
3846c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(),
3847c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                TDLSDiscover(StrEq(kResolvedMac)));
3848c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3849c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3850c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3851c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3852c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3853c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3854c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3855c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3856c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // This is the same test as TDLSInterfaceFunctions above, but using the
3857c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // method called by the RPC adapter.
3858c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3859c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3860c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3861c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3862c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3863c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3864c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3865c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3866c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3867c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3868c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3869c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3870c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3871c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3872c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3873c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3874c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3875c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3876c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3877c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3878c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3879c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3880c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3881c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3882c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3883c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3884c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3885c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3886c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3887c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3888c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3889c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3890c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3891c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3892c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3893c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3894c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  const map<string, string> kTDLSStatusMap {
3896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { "Baby, I don't care", kTDLSUnknownState },
3897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState },
3898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState },
3899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState },
3900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState },
3901c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  };
3902c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3903c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  for (const auto &it : kTDLSStatusMap) {
3904c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3905c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart        .WillOnce(Return(it.first));
3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3907c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(it.second,
3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3916c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3917c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3918c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3919c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3920c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3921c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3922c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3923c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3924c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3925c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3926c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3927c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3928c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3929c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
39433946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
39443946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  Nl80211Message new_wiphy_message(
39453946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString);
39463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39473946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      CreateStringAttribute(Nl80211AttributeWiphyName::kName,
39483946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                            Nl80211AttributeWiphyName::kNameString);
39493946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39503946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      SetStringAttributeValue(Nl80211AttributeWiphyName::kName,
39513946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                              "test-phy");
39523946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
39533946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
39543946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // TODO(quiche): We should test the rest of OnNewWiphy, which parses
39553946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // out frequency information.
39563946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
39573946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
39583946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
39593946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
39603946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
39613946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
39623946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
39633946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
39643946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
39653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
39663946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
3967397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, AddRemoveWakeOnPacketConnection) {
3968397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string1("192.168.0.19");
3969397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string2("192.168.0.55");
3970397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string3("192.168.0.74");
3971397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr1(ip_string1);
3972397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr2(ip_string2);
3973397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr3(ip_string3);
3974397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  Error e;
3975397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
39769c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add and remove operations will fail if WiFi device does not support
39779c73d221484fbd719072261ff288373ce866693fSamuel Tan  // pattern matching.
39789c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
39799c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
39809c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
39819c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
39829c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveAllWakeOnPacketConnections(&e);
39839c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
39849c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
39859c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
39869c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
39879c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
39889c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
39899c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
39909c73d221484fbd719072261ff288373ce866693fSamuel Tan
39919c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add operation will fail if pattern matching is supported but the max number
39929c73d221484fbd719072261ff288373ce866693fSamuel Tan  // of IP address patterns have already been registered.
39939c73d221484fbd719072261ff288373ce866693fSamuel Tan  GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kIPAddress);
39949c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 0;
39959c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
39969c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kOperationFailed);
39979c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
39989c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Max number of IP address patterns already registered");
39999c73d221484fbd719072261ff288373ce866693fSamuel Tan
40009c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 50;
4001397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->Clear();
4002397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4003397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
4004397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4005397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4006397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4007397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4008397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4009397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4010397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4011397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4012397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4013397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4014397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4015397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr3, &e);
4016397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3);
4017397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4018397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4019397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4020397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4021397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4022397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4023397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4024397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4025397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4026397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40279c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Remove fails if no such address is registered.
4028397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4029397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(e.type(), Error::kNotFound);
4030397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_STREQ(e.message().c_str(),
40319c73d221484fbd719072261ff288373ce866693fSamuel Tan               "No such IP address match registered to wake device");
4032397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4033397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4034397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr1, &e);
4035397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4036397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4037397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4038397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4039397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4040397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4041397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4042397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4043397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4044397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4045397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4046397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveAllWakeOnPacketConnections(&e);
4047397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0);
4048397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4049397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4050397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4051397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4052397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4053397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RequestWakeOnPacketSettings) {
4054397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4055397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4056397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4057397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          GetWakeOnPacketConnMessage::kCommand),
4058397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4059397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RequestWakeOnPacketSettings();
4060397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4061397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40625f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettings) {
4063397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4064397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const uint8_t kResponseNoIPAddresses[] = {
4065397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00,
4066397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00};
40675f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  const uint8_t kResponseIPV40WakeOnDisconnect[] = {
40685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x50, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
40695f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00,
40705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00,
40715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00,
40725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40735f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40745f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00};
40755f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request
40765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that there are no wake-on-packet rules programmed into the NIC.
40775f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  scoped_ptr<uint8_t[]> message_memory1(
4078397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      new uint8_t[sizeof(kResponseNoIPAddresses)]);
40795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  memcpy(message_memory1.get(), kResponseNoIPAddresses,
4080397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan         sizeof(kResponseNoIPAddresses));
40815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  nlmsghdr *hdr1 = reinterpret_cast<nlmsghdr *>(message_memory1.get());
40825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnMessage msg1;
40835f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  msg1.InitFromNlmsg(hdr1);
4084397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  // Successful verification.
4085397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4086397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4087397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
40885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg1);
4089397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  // Unsuccessful verification.
4090397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1"));
40915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
40925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
40935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
40945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg1);
40955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
40965f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request
40975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that that the NIC wakes on packets from 192.168.10.20 and on
40985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // disconnects.
40995f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->Clear();
41005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->clear();
41015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  scoped_ptr<uint8_t[]> message_memory2(
41025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      new uint8_t[sizeof(kResponseIPV40WakeOnDisconnect)]);
41035f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  memcpy(message_memory2.get(), kResponseIPV40WakeOnDisconnect,
41045f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan         sizeof(kResponseIPV40WakeOnDisconnect));
41055f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  nlmsghdr *hdr2 = reinterpret_cast<nlmsghdr *>(message_memory2.get());
41065f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnMessage msg2;
41075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  msg2.InitFromNlmsg(hdr2);
41085f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Successful verification.
41095f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20"));
41105f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41115f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
41125f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41135f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
41145f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg2);
41155f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Unsuccessful verification.
41165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kDisconnect);
4117397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4118397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
41195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg2);
4120397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4121397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4122397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RetrySetWakeOnPacketConnections) {
4123397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4124397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  *GetNumSetWakeOnPacketRetries() = WiFi::kMaxSetWakeOnPacketRetries - 1;
4125397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4126397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4127397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4128397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4129397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4130397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RetrySetWakeOnPacketConnections();
4131397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(*GetNumSetWakeOnPacketRetries(),
4132397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan            WiFi::kMaxSetWakeOnPacketRetries);
4133397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4134397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
4135397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4136397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached")));
4137397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RetrySetWakeOnPacketConnections();
4138397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(*GetNumSetWakeOnPacketRetries(), 0);
4139397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4140397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
41415f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, ApplyWakeOnWiFiSettings) {
41425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Disable wake on wifi if there are no wake on wifi triggers registered.
41435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41465f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(0);
4148397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_,
41495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
41505f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
41515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
41525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Otherwise, program the NIC.
41535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
41545f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
41555f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Empty());
41575f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41585f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41595f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41605f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41615f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(1);
41625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
41635f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0);
41645f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
41655f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
4166397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
41675f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiSettingsAppliedBeforeSuspend) {
41685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // When wake_on_packet_connections_ is empty, disable wake on WiFi.
41695f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41735f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(0);
4174397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_,
41755f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
41765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
41775f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
41785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
41795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // When wake_on_packet_connections_ is not empty, program NIC to wake on
41805cce42f7250f04fd114c6312d456a7d6d3aa055fSamuel Tan  // IP address patterns.
41815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
41825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
4183397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4184397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4185397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4186397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4187397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
41885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
41895f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0);
41905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
41915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty());
41925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kIPAddress) !=
41935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              GetWakeOnWiFiTriggers()->end());
41945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
41955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
41965f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiDisabledAfterResume) {
41975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
41985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41995f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
42005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
42015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnAfterResume();
42025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
4203397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4204397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4205853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4206