wifi_unittest.cc revision 8e1ad1684e2dd34619315c14f4b5312b93de0a83
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));
5538e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu      EXPECT_CALL(*GetSupplicantInterfaceProxy(),
5548e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu                  SetHT40Enable(network_path, true));
555a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
556a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5803c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
590bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
591b108318d9554032feee1249d51c961e4f90f4561Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
5923c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
593a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
5940654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
5953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5963c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
5983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
600d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
601b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
602b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
603b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
6052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
6060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kFullScan, nullptr, __func__);
6072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
6080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      wifi_->Scan(Device::kProgressiveScan, nullptr, __func__);
6092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
610c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
6111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
6121590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
6131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
614bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
615bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
616bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
618165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
6193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
6211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
6221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
6242b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
6252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
6261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
627446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
628446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
6292ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  const ServiceRefPtr &GetSelectedService() {
6302ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal    return wifi_->selected_service();
6312ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  }
6327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const string &GetSupplicantBSS() {
6337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
6347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void SetSupplicantBSS(const string &bss) {
6367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
6377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
6391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
6401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
641b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
642b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
643b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
645e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
6493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
6518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
6528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
6533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
6553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
6563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
6573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
6583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
6593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
6603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
6613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
6627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
6637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
6647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
665835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
666835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
667835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6680427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
6690427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
6700427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
671381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
672381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
673381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
674261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
6753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
6773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
6797fab89734d88724a288e96a9996b15548c5294c7Ben Chan                 uint16_t frequency,
6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
682c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart    wifi_->OnIPConfigUpdated(dhcp_config_);
683c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
684f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
685f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
686f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
687f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
688f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
689f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
690f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
691f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
692f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
6933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
6945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
6955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
6975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
6985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
6995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
7005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
701dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
7023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
7041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
7051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
7067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
7077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
7087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
7095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
7105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
7115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
7127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
7137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
7147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
7157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) {
7167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
7177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
718baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
7190afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetLinkStatistics(nullptr);
720baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
721cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
722df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
723cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
72411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
72511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      const WiFiServiceRefPtr &service, const string &rpcid) {
72611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
72711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
728bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
729bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
7320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    return wifi_->GetScanInterval(nullptr);
733e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
7342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
735a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
736a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
737a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
738a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
739a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
740a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
741a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
742a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
743a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
745a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
746a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
747a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
7485412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _, _));
749a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
750125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    StringCallback supplicant_name_owner_callback;
751125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
752125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      EXPECT_CALL(*dbus_service_proxy_.get(),
753125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                  GetNameOwner(WPASupplicant::kDBusAddr, _, _, _))
754125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu          .WillOnce(DoAll(SetErrorTypeInArgument<1>(Error::kOperationInitiated),
755125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu                          SaveArg<2>(&supplicant_name_owner_callback)));
756125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu
757084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Start();
7582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
7590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan    wifi_->SetEnabled(true);  // Start(nullptr, ResultCallback());
760125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu    if (supplicant_present)
761125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      // Mimick the callback from |dbus_service_proxy_->GetNameOwner|.
762125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      supplicant_name_owner_callback.Run(kSupplicantNameOwner, Error());
7633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7642b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
7652b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
7662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7672f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
7682f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
7692f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7702f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
7712f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
7722f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
774084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
7752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
7762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
778084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
7802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
7822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
7832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
784687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
785687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  void SetIPConfig(const IPConfigRefPtr &ipconfig) {
788687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
789687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
7904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
794f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
7954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
7994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
8004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
8014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
8024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
8034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
804bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
805bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
806bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
80710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
808db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
809db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
810db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
811db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
812e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
813e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
814e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
815e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
8161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
8171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
8181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
8211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
8221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
8253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
8263c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
828bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
8291369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
8301369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
8311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
8321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
8333c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
8343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
8353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
8378e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  void OnUnreliableLink() {
8388e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu    wifi_->OnUnreliableLink();
8398e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  }
8408e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
8417fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanShortInterval(const uint16_t &interval, Error *error) {
842bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
843bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
844bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
8457fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) {
846bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
847bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
848bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
849df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSDiscover(const string &peer) {
850df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSDiscover(peer);
851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSSetup(const string &peer) {
854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSSetup(peer);
855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  string TDLSStatus(const string &peer) {
858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSStatus(peer);
859df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
860df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
861df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSTeardown(const string &peer) {
862df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSTeardown(peer);
863df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
864df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
865c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  string PerformTDLSOperation(const string &operation,
866c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              const string &peer,
867c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              Error *error) {
868c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
869c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
870c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
871df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
872df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
873df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
874df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
8753946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  void OnNewWiphy(const Nl80211Message &new_wiphy_message) {
8763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
8773946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
8783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
87910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
88010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
88110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
88210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
88385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
88485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
88585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
88685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
8873239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
8883239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
8893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
890d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
891d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
892d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
893d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
894d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
895d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
896d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
897d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
898d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
8993239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
9003239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
9013239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
9023239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
903af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory *proxy_factory() {
904b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
905b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
906b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
9073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
9083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9103c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9113946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor() {
9123946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
9133946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
9143946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
915397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddressStore *GetWakeOnPacketConnections() {
916397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    return &wifi_->wake_on_packet_connections_;
917397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
918397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
919397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  int *GetNumSetWakeOnPacketRetries() {
920397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    return &wifi_->num_set_wake_on_packet_retries_;
921397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
922397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9235f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggers() {
9245f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    return &wifi_->wake_on_wifi_triggers_;
9255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  }
9265f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
9279c73d221484fbd719072261ff288373ce866693fSamuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggersSupported() {
9289c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_triggers_supported_;
9299c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9309c73d221484fbd719072261ff288373ce866693fSamuel Tan
9319c73d221484fbd719072261ff288373ce866693fSamuel Tan  size_t *GetWakeOnWiFiMaxPatterns() {
9329c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_max_patterns_;
9339c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9349c73d221484fbd719072261ff288373ce866693fSamuel Tan
935397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void AddWakeOnPacketConnection(const IPAddress &ip_endpoint, Error *error) {
936397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->AddWakeOnPacketConnection(ip_endpoint, error);
937397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
938397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
939397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint,
940397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                    Error *error) {
941397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error);
942397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
943397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
944397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveAllWakeOnPacketConnections(Error *error) {
945397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveAllWakeOnPacketConnections(error);
946397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
947397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
948397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RequestWakeOnPacketSettings() { wifi_->RequestWakeOnPacketSettings(); }
949397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9505f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void VerifyWakeOnWiFiSettings(const Nl80211Message &nl80211_message) {
9515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->VerifyWakeOnWiFiSettings(nl80211_message);
952397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
953397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9545f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void ApplyWakeOnWiFiSettings() {
9555f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->ApplyWakeOnWiFiSettings();
956397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
957397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
958397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RetrySetWakeOnPacketConnections() {
959397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RetrySetWakeOnPacketConnections();
960397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
961397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
962e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
9635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
9645c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
9655c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
9663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
968dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
9693426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
970f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
9712ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
972c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
9743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
9753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
9763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor_;  // Owned by |wifi_|.
9773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
9793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
9803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
9813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
982626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
9833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
9843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
985446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
986446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
9877fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
9883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
989084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  scoped_ptr<MockDBusServiceProxy> dbus_service_proxy_;
990dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
991b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
992f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
993f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
994084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  DBusManager *dbus_manager_;
995735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
996735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
997735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
9980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
999735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
1000bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
10013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
10033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1004af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
10053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
10063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1008e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1011446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1012446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
10137fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
10143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
1016b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1017261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1018261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
10203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
10213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
10237fab89734d88724a288e96a9996b15548c5294c7Ben Chan                             uint16_t frequency,
10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
10253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
10293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
10303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
10333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1034a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
10353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
10363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
10383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
10393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10400654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
1041e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
10420654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
1043e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
10440654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
1045b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
10463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1048e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1049e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1050e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1051e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1052e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1053e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1054a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1055a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1056a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1057a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
10582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1059a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1060a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
10619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
10629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
10639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
10649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1066f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1067a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
10682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
10692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
10702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
10719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
10729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
10739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
10749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
10779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
10859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
10869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
10879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1089a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1090a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
10949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
10959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
10969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
10989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
11002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1101a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
11022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1103a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1104a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
11052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
11062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
11082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1109f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1110a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1111a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1112a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1113a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1114a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1115a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1116a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1117f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1119a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1122a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1123a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1125a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1126a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1134a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1141e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1142e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1143e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
11443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
11450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
11473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
11500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
11513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11532b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
11542b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
11552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1157227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1158227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1159227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1160227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1161227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1162227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1163227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1164227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1165227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1166227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1167227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1168227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1169227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1170227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1171227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1172227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1173227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1174227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1175227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
11762b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
11770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
11800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1184227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1185227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1186227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1187227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1188227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1189227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
11902b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
11910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
11929cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
11939cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
11949cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
11959cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
11969cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
11979cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
11982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12002b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
12010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12059cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
12069cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
12079cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
12089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
12102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12122b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
12130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
12160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
12172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
12212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12242b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
12252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1231549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
12323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
12343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
12350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
1236549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1237549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1238c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1239549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1240549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1241549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
12423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
12433c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
12443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
12453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
12463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
12473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1248549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1249549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
12500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1251549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1252549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
12535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
12545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
12583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
12593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
12603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1262b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
12633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
12653239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1266b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
12673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
12683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
12775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
12785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
12825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1284835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
12853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1286835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
12870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
12883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1289835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1290835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1291835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
12920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
12930427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
12940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
12950427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
12960427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
12970427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
12980427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1299381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1300381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1301381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1303381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1304381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1305381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1306381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1307381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1309381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1310381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1311381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1312381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1313381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1314381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1315381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1316381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1317ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1318316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1319316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1320316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1321316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1322b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1323316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1324316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1325316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1326316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1327316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1328316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1329316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1330316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1331316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1332b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1333ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1334ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  Mock::VerifyAndClearExpectations(service);
1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1337316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1338316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1339316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
1340b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false))
1341316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1342316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1343ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1344ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1345381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1346381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1348381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1349381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1350381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1351381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1352381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1353381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1354381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1355381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1356381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1357381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1359381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1360381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1361381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1362381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1363381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1364381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1365381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1366381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
13675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
13685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
13703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
13713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
13723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
13733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
13742b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
13753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
13763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
13773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13783239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
13793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
13825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
13835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
13865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
13875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
13885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
13895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
13905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
13925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
13933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
13943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
13953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
13963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
14002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
14023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1406f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
14092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1411c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1413c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1414c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1425c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1426c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14282ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1429c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
14302ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
14320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1433c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
14343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1435c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1437c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1438c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1441c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
14422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
14432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
14442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1446c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1447c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14492ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14502ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
14512ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1453c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1454c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
14555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
14562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
14582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1460f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
14632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
14655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
14782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
14852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
14870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
14885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
14895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
14982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
14995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
15002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
15025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
15042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
15055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
15085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1510ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1511ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15135c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1514ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1515ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
15165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15175f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15182f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1519ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1520ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1521ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
15235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
15285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
15330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
15340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
15350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
15405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1542ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1543ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1545ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1546ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15492f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1550ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1551ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1552ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15595f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
15635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
15675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1569ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1570ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
15730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
15743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
15753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
15765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15773ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1579ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1581ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1582ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1583ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
15855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
15900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
15915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
15925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
15935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
15965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1597df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
15985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
15995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16028e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) {
16038e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
16048e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  SetupConnectedService(DBus::Path(), NULL, NULL);
16058e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
16068e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
16078e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1);
16088e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnAfterResume();
16098e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16108e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
16118e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
16123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
16133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
16143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1615e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
16163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1617e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
16183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1619e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
16203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1621e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
16227fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
1623e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1624e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1625e41a72d0737488d561a4158019409d5785dad61bThieu Le
1626e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1627e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1628e41a72d0737488d561a4158019409d5785dad61bThieu Le
1629e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1630e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1631e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1632e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1633e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1634e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1635e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1636e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1637e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1638e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1639e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1640e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
16413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
16443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
16493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
16503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
16543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
16553c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
16573c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1662b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
16630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
1664e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1665b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1666e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1667e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
16688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16698a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16708a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
16718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
16763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16793c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16803c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1683261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1684261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1685261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1686261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
16933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
16943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
16953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1697835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1698835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
16993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
17000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
1701835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1702835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
17033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1704835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart
17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
17080654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1709835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1710835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1711a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
1712a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
17133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
17143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1715835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1716835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1717835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
17180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
17190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
17210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
17233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17244943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
17254943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17264943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17274943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
17284943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
17290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17304943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
17314943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17324943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
17334943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
17344943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
17350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17364943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
17374943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17384943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
17393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
17420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
17460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
17480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
17493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
17500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
17543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
17570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
17583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
17623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
17653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
17660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
17680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
17690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
17710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17722b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
17730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
17763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
17773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
17780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17804943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
17840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
17850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1786835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1787835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1788af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
1789af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
1790af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
1791af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
1792af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
1793835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1794735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
17953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
17964943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
17974943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17984943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
17990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18004943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18014943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
18024943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18034943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
18044943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
18054943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ::DBus::Path kPath("/fake/path");
18060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18074943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18084943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
18094943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18104943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
18114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
18124943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
18134943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18144943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
18154943822214f823c2437aa32b0376414b3e60388dPeter Qiu  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
18164943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
18174943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
18184943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
18194943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
18204943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false));
18214943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
18224943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
18234943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
18244943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
18250654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1830c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
18313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
18330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1835c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1837c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1838c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1839c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1840c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
18410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18420afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
1843c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1844c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
18450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
18460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
18474943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
18494943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(),
18500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
18510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
18540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
18550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18582b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
18594943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18604943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
18614943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
18624943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18632b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
18642b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
18651aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
18661aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
18671aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  DBus::Path kPath("/fake/path");
18680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18691aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18701aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
18711aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
18721aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
18731aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18741aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18751aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
18761aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
18771aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18781aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
18791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
18800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
18821aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
18841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
18861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
1887d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
1888d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1889d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1891d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1892d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1893d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1894d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1895d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1896d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1897d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
1898d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1899d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1900d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1902d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1904d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19090afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1910d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(),
19120afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1913d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1917d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1918d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(0);
1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1923d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1926d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
19340afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1937d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1938d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1939d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1940d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
1942d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1943d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1944d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(1);
1945d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1946d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1947d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1948d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1949d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1950d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1951d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1952d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
195317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
19549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
195517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
195617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
19579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
19589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
195944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
196044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
196117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
196217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
196317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
19640d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
19650d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
19660d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")))
196717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
196817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
196917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
197033a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
197117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
19720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
197344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
1974a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
197544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
1976a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
1977a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1978a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
19790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
19810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
198217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
19830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
198433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
198533a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
198617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
19870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
19880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
19890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
199017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
199117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
199217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
19932b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
19942b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
19952b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
19963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
19970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
19982b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
19992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
200017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
200117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
20020d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
20030d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
20040d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")));
200517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
200617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
200717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
200817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
20100afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
20110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
20140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
20153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
20160afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
20173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
20180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
20223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
20240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
20253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
20260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
20270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
20280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
20290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
20303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
20310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
20330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20355c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2036c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
20390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
20410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
20423c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
20440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
20460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2048c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2049b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2050c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
20515c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
20525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2053549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
20570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20623c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
20633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2064549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
20650afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2066549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2067549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2068446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
20710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
20723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
20731aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20740654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20760654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
20771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20780654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2080446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
20811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20820654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20851aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2088446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2089446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
20905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2091a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
20920654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
2093ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
2094ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2095ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2096ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2097ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
2098ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
2099ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
2100ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2101ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2102ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2103ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
21043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
21053c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
21083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
21090654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
21103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
2111ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2112ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
21135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
21145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
21163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
21173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
21215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
21225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
21233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
21253c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
21295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
21345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2138ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
21395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21405412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
21455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
21505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
21625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21645412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2165ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2166ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2167ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2168fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2169fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2170fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2171fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2172fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
21733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
21745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2175fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2176fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2177fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
21785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
2179fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2180fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2181fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2182fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
21831e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
21841e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
21851e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
21861e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
21871e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
21881e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
21891e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal      .WillOnce(Throw(DBus::Error("don't care", "don't care")));
21901e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
21911e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
21921e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
21931e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
21941e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
21955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
21965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
21975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
21985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
21995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
22019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
22027de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
22062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
22075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2212f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2213df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2214df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2215df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2216f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
22175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
22185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
22205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
22225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
22265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
22295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
22305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
223344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
223444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
223544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
223644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
22389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
22395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
22422ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
22437de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
22445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
22495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
22505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
22525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
22535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
22545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
22560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
22575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
22595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2260a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2261a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
22640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
22680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
22702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
22712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
22722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
22735412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
22742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
22755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
22772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
22785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
22800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
22830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
22842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
22850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
22862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
22870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
22917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
22927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
22937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
22947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
22957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
22960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
22970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
22987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
22997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
23007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
23017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
23027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
23037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2304f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
23057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
23067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
23070654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
23087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
23107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2311d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
23127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
23167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
2317b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2318d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
23207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2321f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2322bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2323bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2324bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
23257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
23260654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
23270654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
23280654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
23297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
23307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
23317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
23323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
23333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
23347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2336a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
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()).Times(0);
2342a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2343a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2344a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2345a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2346a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2347a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2348a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2349a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2350a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2354a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2356f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2357a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23580654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
23590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2362a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2363a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2364a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2365a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2367a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2368a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2369a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
23702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2371a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23720654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
23730654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2374a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
23750654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2376a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2377a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23781590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
23791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
23803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
23813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
23820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr);
23831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
23844943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
23850654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
23860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
23870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2388687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
23891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
23901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
23911590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
23921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
23933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
23940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
23963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
23970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
23983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
23991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2400c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2401c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2402c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2403c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
24043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
24053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
24063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2407bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2408a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
24090654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2411687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
24133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
24141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
24151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2416e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2417e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
24180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
24190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
24200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
24213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
24220afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
24233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
24253c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2428687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
24290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2430687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2431687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2432687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2433687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2434687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2435687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2436687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2437687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2438687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2439687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  Mock::VerifyAndClearExpectations(ipconfig);
2440687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24414eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
24424eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
24438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
24448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
24460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
24488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
24500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
24520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
245549c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
245649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
245749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ::DBus::Path bss_path;
245849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
245949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, &bss_path));
246149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
24620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
246349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
246449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
246549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
246649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
246749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
246849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
246949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
247049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
247149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
24720afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
24730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
247449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
247549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
247649c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
24778a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
24788a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
24803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
24810afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
24838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
24854a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
24860654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
24879d97b7deda3ae604d718873207a951f62d418b34Paul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) &&
24880654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
24894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
24904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
24914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
24924d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
24933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
24940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2495a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
24963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
24970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
24984d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
24994d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
25004d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
25014a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
25024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
25033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
25040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2505a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
25063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
25074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
25084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
25094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
25104a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
25114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2512f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
25134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
25173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25190654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
25204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
25243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
25253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25263c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25300654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25324a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25334a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
25410654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
25424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25490654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
25554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25575c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
25585c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
25590654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
25605c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
25613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25625c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
25633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25645c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
25655c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
25665c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
25670654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25685c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
25695c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
25704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
25714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2572c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2573c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
25743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
25750afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
2576c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2577c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2578c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2579c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2580c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2581c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
2582c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
2583c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2584c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2585c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2586c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
25873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
25880afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
25898f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
25918f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
25928f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
25930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
25945519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
25953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
25963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
25973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
25988f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
25998f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
26005519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
26015519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
26023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
26033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
26043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
26050654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2606c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2607c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2608b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2609b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2610b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2611b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2612b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2613b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2614b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2615b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2616b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2617b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2618b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2619b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2620b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2621b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2622b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2623b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2624b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
26253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
26260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
26270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
26283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2629b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2630b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2631b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2632b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2633b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
26345c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
26355c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
26365c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
26375c05b2920be742d518829972127172481722058dmukesh agrawal
26385c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
26395c05b2920be742d518829972127172481722058dmukesh agrawal
26405c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
26415c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
26425c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
26433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
26445c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
26455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
26462f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
26475c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
26485c05b2920be742d518829972127172481722058dmukesh agrawal}
26495c05b2920be742d518829972127172481722058dmukesh agrawal
26505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
26515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2652b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2653b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2654b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2655b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2656b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2657b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26587de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
26590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2660b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2661b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2662b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2663b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2664b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2665b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
26675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
26685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
26705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
26715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
26720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
26745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
26755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
26765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
26785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2680b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2681b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2682b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2683b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2684b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2685b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2688b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
26895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2690b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2691b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2692b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2693b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
26983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
26990afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr);
2700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2703b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
27045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
2716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2725b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2726b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2729b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
2733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2734b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
27375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
27385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
27395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
27415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
27425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
27435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
2744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
27475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
27485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
27495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
27505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
27525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2754b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2755b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
27570afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2758df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
27593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
27603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
27613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
2762a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27643c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
27655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
27660654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2767b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2768b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2769b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2770b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2771b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2772b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27730afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2774b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2775df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
27763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27773c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
27780654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2779b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2780b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27823c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
27833c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
27842ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
27852ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
27863c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
27872ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
27883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
27893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
27903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
27912ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
27922ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
27932ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
27943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
27953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
2796daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
27973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
27982ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
27992ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
28002ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
28012ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
28022ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
28032ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
28042ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
28052ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
28062ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28072ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
28082ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
28092ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
28103c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2811daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
2812daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1);
28133c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
28143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28153c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
28163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
28178e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) {
28188e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
28198e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  SetupConnectedService(DBus::Path(), NULL, NULL);
28208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
28218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1);
28228e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnUnreliableLink();
28238e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28248e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
28258e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
2826cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2827f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2828bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
28290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2830cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2831cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2832bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
2833f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
28340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2835bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2836bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
2837bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
28380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
28391369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2840bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
28411369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2842cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2843cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2844f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
2845f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
2846f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
2847f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
2848a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
2849f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
2850f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
2851f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2852f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
2853f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
2854f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
2855f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2856f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2857b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2858f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
2859f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
2860f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2861f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2862f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2863f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2864f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
2865f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2866f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2867f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
2868f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
2869f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
2870f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
2871f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2872f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2873f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2876f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2877f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
2878f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
28800d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
28810d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
28820d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2883f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2884f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2885f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2886f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
2887f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
2888f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2889f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
28900d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
28910d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
28920d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2893f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2894f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2895f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2896f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
2897f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
2898f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2899f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
2900f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
29010d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
29020d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
29030d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    StrEq("OnIPConfigFailure")));
2904f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2905f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
2906f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
29071369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
2908f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
2909735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2910735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2911735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2912735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2913735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2914bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
29150afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2916bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2917bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2918bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
29191369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2920bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
29211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2922bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2923bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2924bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
29250afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2926bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2927bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2928bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2929bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
29300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
29311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29331369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2934f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
2935cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
29360654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2937cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2938a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
2939bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2940f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
29414943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2942735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2943cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2944f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
29450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
29461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29471369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29481369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
2949f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
29501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
29511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2952735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2953735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
29544943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2955735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2956735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2957735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2958735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2959735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2960bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2961735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
29621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
296339a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
2964735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
29650654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2966cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2967cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2968e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2969e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
29701aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2971e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
29721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2973e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2974e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2975e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2976e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2977e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2978e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
29801aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2981e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
2986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
2987e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
2988e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
2989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
2990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
2991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
2992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
2993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2994e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
2995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
2997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
2998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
3001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
3003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
3007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
3008e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
3009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3011e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
30121aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
30130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
3014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
3015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
3016e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
3020e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3021e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3022e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3023e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
3024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3026e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3027e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3028e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3029e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3030e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3031e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
30321aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
30331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
30360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
30371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
30441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
30501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
30581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
30601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30617cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
30627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
30667cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
30677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
30680afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
30697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
30707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30725412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
30737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
30747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
30757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
30777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
30797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
30827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
30837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
30847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
30887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
30897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
30907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
30917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
30927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
30947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
30977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
30987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
30995412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
31017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
31027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
31037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
31047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
31067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
31077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
31087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3109baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3110baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3111baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3112baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
31137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
31147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
31157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
31167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
31177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
31187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
31197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
31207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
31217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
31227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
31237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3124baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
31257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3126baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3127baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3128baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3129baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3130baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3131baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3132baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3133baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3134baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3135baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3136baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3137baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3138baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3139baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3140baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3141baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3142baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3143baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3144baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3145baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3146baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3149baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3150baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3151baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3152baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3153baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3154baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3155baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3156baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3157baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3158baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3159baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3160baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3161baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3163baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
31747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
31757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
31777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
31788e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
31797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
31807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
31817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3184baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3185baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3186baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3187baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3188baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3189baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3190baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3191baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3192baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3193baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3194baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3195baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3196baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3197baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3198baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3199baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3200baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3201baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3202baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3203baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3204baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3205baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3206baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3207baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3208baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3209e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3210e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3211e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3212e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3213e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3214e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3215e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3216e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3217e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3218e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3219e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3220e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3221e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3222e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3223e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3224e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3225e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3226e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3227e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3228e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3229e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3230e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3231e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3232e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3233e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3234e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3235e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3236e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3237e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3238e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3239e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3240e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3241e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3242e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3243e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3244e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3245e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
32468e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
32478e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3248e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3249e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3250e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3251e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3252e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3253e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
32547cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
32557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3256bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3257f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3258bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3259bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3260bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3261bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3262bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
3263bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3264bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3265bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3266bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3267bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3268bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3269bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3270bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
32717fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
32720654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
3273bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3274bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3275bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3276bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3277bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3278bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3279bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
32800654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
3281bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
3282bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3283bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3284db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3285db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3286db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
328711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3288db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3289db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3290735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3291735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3292735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3293735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3294db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3295db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3296db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3297f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3298db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3299735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3300db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3301735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3302735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
3303735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3304db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3305735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3306735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3307735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
33080d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
33090d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33100d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
3311735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
331211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
331311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  MockEapCredentials *eap = new MockEapCredentials();
331411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
331511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
331611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
331711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
331811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
331911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
332011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
332111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
332211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
33230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
33240d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33250d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
332611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
332711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
332811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
332911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
333011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
333111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
333211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
333311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
33340d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
333511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
333611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
333711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
333811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
333911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3340bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3341bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3342c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3343c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3344c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3345c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3346c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3347c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3348c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3349c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3350c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3351c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3352c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3353c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
33546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
33556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
33566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
33576d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
33586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
33597fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
33606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
33616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
33626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
33646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
33656d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
33666d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
33686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
33706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
33716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
33726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
33736d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
33746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
33756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
33766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
33786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
33796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
33806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
33816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
33826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
33846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
33856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
33866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
33876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
33886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
33896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
33907347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
33917347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
33926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33935581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
33945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
33955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
33965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
33975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
33985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
33995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
34035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
34045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34050654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
34065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
34085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
34115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
34125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34130654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
34140654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
34150654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
34160654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
34170654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
34180654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
34190654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
34200654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
34215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34285581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34295581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
34335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
34345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34350654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
34360654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
34375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
34425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
34435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34440654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
34465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
34515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
34525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34530654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
34540654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
34605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
34615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
34635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
34665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
346750cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
346850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
346950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
347050cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
347150cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
3472bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
3473bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
3474bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
3475bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
3476bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3477bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
34787fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
3479bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3480bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
3481bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3482bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3483bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
3484bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3485bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3486bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3487bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
3488bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3489bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
34907fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
3491bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3492bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3493bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3494bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3495bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3496bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3497bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3498bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3499bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
3500bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3501bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3502bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
3503bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3504bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3505bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
3506bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
35070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
35080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35090cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
35109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
35110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
3512a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3513a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3514a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3515a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3516a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35170cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
35197de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
35200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
35210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35240cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35270cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
35289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
35290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
35329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
35339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
35340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3536a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3538a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3539a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3540a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
35430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35470cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35500cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
35519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
35520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
35560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3558a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3560a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3561a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3562a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
35650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
3572df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
35739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3574df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
35759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
3577df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3578df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
3579a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3580a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
3581a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
35829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3583df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3584df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3585df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3586df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
3587df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
3588df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
3589df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
3590df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3591df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3592df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3593df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3594df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3595b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
3596b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3597b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
3598df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
3599b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
3600b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3601df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
3602df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3603df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
3604df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3605a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3606df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3607b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
3608b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
3609b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
3610b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3611df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
3612df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3613df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3614df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
3615df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3616a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3617df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3618df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3619df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3620df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
3621df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3622df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3623df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
36240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
3625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
36269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3627df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3628df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
3629a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3630a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3631df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
36320afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
3636a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3637a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
36389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3640df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3642df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
3643df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
3644df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
36450afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3646df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3648df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
36490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
3650df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3651a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3652a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
3653df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3654df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3655df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
36569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3658a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3659df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
3660df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
3661df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
3663df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3665df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3666df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3667f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
3668f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3669a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
3670df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3672df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3675df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
36760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
36770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
36780afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
3679df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
36809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3681df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3682df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
3683df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
3684a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3685a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3686f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3690df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
3691a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3692df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3694df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3698df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3699df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
3700df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
3701f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
3702a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
3703a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
37042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
3705df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
3706a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
3707a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3708a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3709a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
3712a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3713df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3714df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
3715a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3716df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3717df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
3718df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
3719a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3720df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3721df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3722df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3723df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
3724df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3725df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
3726df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
3727df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
3728df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3729df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
3730a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
3731df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
3732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
3733df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3734df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3735df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3736df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3737df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
37383bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
37393bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
37400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
37413bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37423bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37433bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
37442ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37453bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
37463bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
37473bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37483bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
37497de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
37503bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
37513bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37523bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
37533bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
37552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
37562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
37582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
37612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
37632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
37702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
37712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
37732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
37782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
3784c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) {
3785df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  StartWiFi();
3786df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kPeer[] = "peer";
3787df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3788df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3789df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3790df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3791df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3792df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3793df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3794df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSDiscover(kPeer));
3795df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSDiscover(kPeer));
3796df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3797df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3798df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3799df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3800df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3801df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3802df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3803df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3804df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSSetup(kPeer));
3805df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSSetup(kPeer));
3806df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3807df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3808df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kStatus[] = "peachy keen";
3809df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3810df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return(kStatus))
3811df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3812df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3813df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3814df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3815df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ(kStatus, TDLSStatus(kPeer));
3816df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ("", TDLSStatus(kPeer));
3817df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3818df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3819df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3820df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3821df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3822df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3823df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3824df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3825df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSTeardown(kPeer));
3826df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSTeardown(kPeer));
3827df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3828df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart}
3829df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3830c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) {
3831c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  StartWiFi();
3832c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kPeer[] = "00:11:22:33:44:55";
3833c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3834c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3835c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3836c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error));
3837c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3838c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3839c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3840c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3841c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3842c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error));
3843c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // This is not a valid IP address nor is it a MAC address.
3844c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3845c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3846c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3847c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kAddress[] = "192.168.1.1";
3848c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3849c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3850c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3851c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // The provided IP address is not local.
3852c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3853c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(false));
3854c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3855c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3856c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3857c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3858c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3859c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3860c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3861c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3862c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // If the MAC address of the peer is in the ARP cache, we should
3863c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // perform the TDLS operation on the resolved MAC.
3864c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const char kResolvedMac[] = "00:11:22:33:44:55";
3865c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const ByteString kMacBytes(
3866c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac));
3867c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3868c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(true));
3869c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _))
3870c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true)));
3871c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(),
3872c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                TDLSDiscover(StrEq(kResolvedMac)));
3873c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3874c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3875c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3876c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3877c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3878c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3879c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3880c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3881c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // This is the same test as TDLSInterfaceFunctions above, but using the
3882c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // method called by the RPC adapter.
3883c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3884c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3885c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3886c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3887c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3888c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3889c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3890c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3891c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3892c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3893c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3894c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3901c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3902c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3903c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3904c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3905c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3907c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3916c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3917c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3918c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3919c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3920c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  const map<string, string> kTDLSStatusMap {
3921c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { "Baby, I don't care", kTDLSUnknownState },
3922c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState },
3923c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState },
3924c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState },
3925c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState },
3926c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  };
3927c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3928c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  for (const auto &it : kTDLSStatusMap) {
3929c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart        .WillOnce(Return(it.first));
3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(it.second,
3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3943c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3944c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3945c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3946c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3947c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3948c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3949c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3950c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3951c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3952c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3953c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3954c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3955c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3956c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3957c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3958c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3959c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3960c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3961c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3962c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3963c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3964c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3965c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3966c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
3967c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
39683946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
39693946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  Nl80211Message new_wiphy_message(
39703946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString);
39713946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39723946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      CreateStringAttribute(Nl80211AttributeWiphyName::kName,
39733946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                            Nl80211AttributeWiphyName::kNameString);
39743946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39753946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      SetStringAttributeValue(Nl80211AttributeWiphyName::kName,
39763946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                              "test-phy");
39773946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
39783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
39793946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // TODO(quiche): We should test the rest of OnNewWiphy, which parses
39803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // out frequency information.
39813946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
39823946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
39833946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
39843946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
39853946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
39863946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
39873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
39883946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
39893946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
39903946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
39913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
3992397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, AddRemoveWakeOnPacketConnection) {
3993397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string1("192.168.0.19");
3994397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string2("192.168.0.55");
3995397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string3("192.168.0.74");
3996397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr1(ip_string1);
3997397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr2(ip_string2);
3998397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr3(ip_string3);
3999397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  Error e;
4000397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40019c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add and remove operations will fail if WiFi device does not support
40029c73d221484fbd719072261ff288373ce866693fSamuel Tan  // pattern matching.
40039c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
40049c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40059c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40069c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40079c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveAllWakeOnPacketConnections(&e);
40089c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40099c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40109c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40119c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
40129c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40139c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40149c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40159c73d221484fbd719072261ff288373ce866693fSamuel Tan
40169c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add operation will fail if pattern matching is supported but the max number
40179c73d221484fbd719072261ff288373ce866693fSamuel Tan  // of IP address patterns have already been registered.
40189c73d221484fbd719072261ff288373ce866693fSamuel Tan  GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kIPAddress);
40199c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 0;
40209c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
40219c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kOperationFailed);
40229c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40239c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Max number of IP address patterns already registered");
40249c73d221484fbd719072261ff288373ce866693fSamuel Tan
40259c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 50;
4026397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->Clear();
4027397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4028397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
4029397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4030397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4031397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4032397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4033397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4034397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4035397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4036397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4037397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4038397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4039397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4040397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr3, &e);
4041397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3);
4042397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4043397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4044397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4045397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4046397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4047397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4048397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4049397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4050397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4051397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40529c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Remove fails if no such address is registered.
4053397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4054397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(e.type(), Error::kNotFound);
4055397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_STREQ(e.message().c_str(),
40569c73d221484fbd719072261ff288373ce866693fSamuel Tan               "No such IP address match registered to wake device");
4057397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4058397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4059397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr1, &e);
4060397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4061397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4062397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4063397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4064397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4065397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4066397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4067397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4068397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4069397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4070397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4071397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveAllWakeOnPacketConnections(&e);
4072397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0);
4073397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4074397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4075397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4076397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4077397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4078397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RequestWakeOnPacketSettings) {
4079397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4080397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4081397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4082397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          GetWakeOnPacketConnMessage::kCommand),
4083397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4084397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RequestWakeOnPacketSettings();
4085397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4086397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40875f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettings) {
4088397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4089397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const uint8_t kResponseNoIPAddresses[] = {
4090397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00,
4091397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00};
40925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  const uint8_t kResponseIPV40WakeOnDisconnect[] = {
40935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x50, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
40945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00,
40955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00,
40965f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00,
40975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40995f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00};
41005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request
41015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that there are no wake-on-packet rules programmed into the NIC.
41025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  scoped_ptr<uint8_t[]> message_memory1(
4103397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      new uint8_t[sizeof(kResponseNoIPAddresses)]);
41045f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  memcpy(message_memory1.get(), kResponseNoIPAddresses,
4105397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan         sizeof(kResponseNoIPAddresses));
41065f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  nlmsghdr *hdr1 = reinterpret_cast<nlmsghdr *>(message_memory1.get());
41075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnMessage msg1;
41085f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  msg1.InitFromNlmsg(hdr1);
4109397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  // Successful verification.
4110397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4111397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4112397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
41135f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg1);
4114397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  // Unsuccessful verification.
4115397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1"));
41165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41175f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41185f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
41195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg1);
41205f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
41215f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request
41225f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that that the NIC wakes on packets from 192.168.10.20 and on
41235f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // disconnects.
41245f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->Clear();
41255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->clear();
41265f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  scoped_ptr<uint8_t[]> message_memory2(
41275f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      new uint8_t[sizeof(kResponseIPV40WakeOnDisconnect)]);
41285f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  memcpy(message_memory2.get(), kResponseIPV40WakeOnDisconnect,
41295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan         sizeof(kResponseIPV40WakeOnDisconnect));
41305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  nlmsghdr *hdr2 = reinterpret_cast<nlmsghdr *>(message_memory2.get());
41315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnMessage msg2;
41325f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  msg2.InitFromNlmsg(hdr2);
41335f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Successful verification.
41345f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20"));
41355f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41365f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
41375f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41385f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
41395f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg2);
41405f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Unsuccessful verification.
41415f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kDisconnect);
4142397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4143397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
41445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  VerifyWakeOnWiFiSettings(msg2);
4145397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4146397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4147397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RetrySetWakeOnPacketConnections) {
4148397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4149397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  *GetNumSetWakeOnPacketRetries() = WiFi::kMaxSetWakeOnPacketRetries - 1;
4150397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4151397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4152397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4153397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4154397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4155397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RetrySetWakeOnPacketConnections();
4156397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(*GetNumSetWakeOnPacketRetries(),
4157397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan            WiFi::kMaxSetWakeOnPacketRetries);
4158397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4159397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
4160397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4161397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached")));
4162397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RetrySetWakeOnPacketConnections();
4163397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(*GetNumSetWakeOnPacketRetries(), 0);
4164397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4165397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
41665f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, ApplyWakeOnWiFiSettings) {
41675f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Disable wake on wifi if there are no wake on wifi triggers registered.
41685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41695f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41725f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(0);
4173397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_,
41745f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
41755f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
41765f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
41775f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Otherwise, program the NIC.
41785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
41795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
41805f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Empty());
41825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41835f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41845f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41855f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41865f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(1);
41875f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
41885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0);
41895f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
41905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
4191397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
41925f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiSettingsAppliedBeforeSuspend) {
41935f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // When wake_on_packet_connections_ is empty, disable wake on WiFi.
41945f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
41955f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
41965f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
41975f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
41985f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(0);
4199397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_,
42005f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
42015f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
42025f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
42035f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
42045f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // When wake_on_packet_connections_ is not empty, program NIC to wake on
42055cce42f7250f04fd114c6312d456a7d6d3aa055fSamuel Tan  // IP address patterns.
42065f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
42075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
4208397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4209397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4210397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4211397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4212397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
42135f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
42145f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0);
42155f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
42165f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty());
42175f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kIPAddress) !=
42185f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              GetWakeOnWiFiTriggers()->end());
42195f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
42205f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
42215f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiDisabledAfterResume) {
42225f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
42235f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
42245f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
42255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
42265f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnAfterResume();
42275f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
4228397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4229397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4230853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4231