wifi_unittest.cc revision ef76af866aa73abb8c16958844cb13f042881bcb
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>
18a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
231830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
26125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu#include "shill/error.h"
2726b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
298ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
30a6270fd8fa1bd88a802595d91d80de86081847beSamuel Tan#include "shill/ip_address.h"
31397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan#include "shill/ip_address_store.h"
327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
36084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h"
37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
4111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
42e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
43687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.h"
443c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
45cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
463946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/mock_mac80211_monitor.h"
472ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
483426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
49bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h"
5010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
51af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h"
525c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h"
54a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
55b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
56735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h"
573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
58835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
605c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
613c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h"
64dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
653946da840142cd386d628c0e879459f8976bd86dmukesh agrawal#include "shill/nl80211_attribute.h"
665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h"
67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h"
6985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
70af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan#include "shill/wake_on_wifi.h"
723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
74ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
760e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
77a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
795f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tanusing std::set;
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
81ef76af866aa73abb8c16958844cb13f042881bcbBen Chanusing std::unique_ptr;
82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
853c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
87a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
88cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
91b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
92549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
98dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
99d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
10011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref;
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
102af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew;
103ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
104ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
106a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
108853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
1093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
1108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
113853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
120c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234;
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() {
771fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    ResultCallback callback(
772fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this)));
773fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->OnBeforeSuspend(callback);
7742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7752b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
776084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
7772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
7782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
780084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
7812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
7822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
7842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
7852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
786687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
787687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
788687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
789687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  void SetIPConfig(const IPConfigRefPtr &ipconfig) {
790687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
791687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
7924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
796f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
7974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
8004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
8014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
8024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
8034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
8044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
8054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
806bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
807bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
808bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
80910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
810db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
811db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
812db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
813db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
814e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
815e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
816e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
817e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
8181aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
8191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
8201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
8231aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
8241aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
8251aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
8263c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
8273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
8283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
830bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
8311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
8321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
8331369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
8341369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
8353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
8363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
8373c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
8383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
8398e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  void OnUnreliableLink() {
8408e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu    wifi_->OnUnreliableLink();
8418e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  }
8428e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
8437fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanShortInterval(const uint16_t &interval, Error *error) {
844bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
845bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
846bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
8477fab89734d88724a288e96a9996b15548c5294c7Ben Chan  bool SetBgscanSignalThreshold(const int32_t &threshold, Error *error) {
848bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
849bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
850bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
851df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSDiscover(const string &peer) {
852df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSDiscover(peer);
853df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
854df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
855df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSSetup(const string &peer) {
856df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSSetup(peer);
857df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
858df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
859df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  string TDLSStatus(const string &peer) {
860df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSStatus(peer);
861df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
862df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
863df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSTeardown(const string &peer) {
864df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSTeardown(peer);
865df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
866df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
867c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  string PerformTDLSOperation(const string &operation,
868c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              const string &peer,
869c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              Error *error) {
870c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
871c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
872c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
873df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
874df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
875df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
876df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
8773946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  void OnNewWiphy(const Nl80211Message &new_wiphy_message) {
8783946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    wifi_->OnNewWiphy(new_wiphy_message);
8793946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
8803946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
88110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
88210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
88310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
88410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
88585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
88685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
88785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
88885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
8893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
8903239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
8913239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
892d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
893d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
894d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
895d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
896d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
897d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
898d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
899d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
900d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
9013239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
9023239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
9033239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
9043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
905af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory *proxy_factory() {
906b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
907b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
908b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
9103c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
9113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
9123c5040174273386868cc8dea8044d22c465885d8Paul Stewart
9133946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor() {
9143946da840142cd386d628c0e879459f8976bd86dmukesh agrawal    return mac80211_monitor_;
9153946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  }
9163946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
917397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddressStore *GetWakeOnPacketConnections() {
918397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    return &wifi_->wake_on_packet_connections_;
919397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
920397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
921fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  int GetNumSetWakeOnPacketRetries() {
922fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    return wifi_->num_set_wake_on_packet_retries_;
923fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  }
924fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
925fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  void SetNumSetWakeOnPacketRetries(int num_retries) {
926fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->num_set_wake_on_packet_retries_ = num_retries;
927397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
928397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9295f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggers() {
9305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    return &wifi_->wake_on_wifi_triggers_;
9315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  }
9325f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
9339c73d221484fbd719072261ff288373ce866693fSamuel Tan  set<WakeOnWiFi::WakeOnWiFiTrigger> *GetWakeOnWiFiTriggersSupported() {
9349c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_triggers_supported_;
9359c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9369c73d221484fbd719072261ff288373ce866693fSamuel Tan
9379c73d221484fbd719072261ff288373ce866693fSamuel Tan  size_t *GetWakeOnWiFiMaxPatterns() {
9389c73d221484fbd719072261ff288373ce866693fSamuel Tan    return &wifi_->wake_on_wifi_max_patterns_;
9399c73d221484fbd719072261ff288373ce866693fSamuel Tan  }
9409c73d221484fbd719072261ff288373ce866693fSamuel Tan
941397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void AddWakeOnPacketConnection(const IPAddress &ip_endpoint, Error *error) {
942397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->AddWakeOnPacketConnection(ip_endpoint, error);
943397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
944397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
945397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveWakeOnPacketConnection(const IPAddress &ip_endpoint,
946397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                    Error *error) {
947397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveWakeOnPacketConnection(ip_endpoint, error);
948397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
949397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
950397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RemoveAllWakeOnPacketConnections(Error *error) {
951397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan    wifi_->RemoveAllWakeOnPacketConnections(error);
952397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
953397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
954397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  void RequestWakeOnPacketSettings() { wifi_->RequestWakeOnPacketSettings(); }
955397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void VerifyWakeOnWiFiSettings(const Nl80211Message &nl80211_message) {
9575f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->VerifyWakeOnWiFiSettings(nl80211_message);
958397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
959397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
9605f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  void ApplyWakeOnWiFiSettings() {
9615f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan    wifi_->ApplyWakeOnWiFiSettings();
962397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
963397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
964fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  void RetryApplyWakeOnWiFiSettings() {
965fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->RetryApplyWakeOnWiFiSettings();
966397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  }
967397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
968fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  void SetSuspendActionsDoneCallback() {
969fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    wifi_->suspend_actions_done_callback_ =
970fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan        base::Bind(&WiFiObjectTest::SuspendCallback, base::Unretained(this));
971fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  }
972fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
973fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  bool SuspendActionsCallbackIsNull() {
974fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan    return wifi_->suspend_actions_done_callback_.is_null();
975fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  }
976fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
977fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  MOCK_METHOD1(SuspendCallback, void(const Error &error));
978fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
9805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
9815c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
9825c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
9833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
985dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
9863426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
987f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
9882ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
989c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
9903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
9913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
9923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
9933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  MockMac80211Monitor *mac80211_monitor_;  // Owned by |wifi_|.
9943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
9963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
9973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
9983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
999626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
10003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
10013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
1002446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
1003446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
10047fab89734d88724a288e96a9996b15548c5294c7Ben Chan  static const uint16_t kRoamThreshold;
10053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1006ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockDBusServiceProxy> dbus_service_proxy_;
1007ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
1008ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
1009f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
1010f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
1011084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  DBusManager *dbus_manager_;
1012735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
1013735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
1014735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
10150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
1016735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
1017bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
10183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1020ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1021af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
10223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
10233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
1025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
1026e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
1027e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
1028446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
1029446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
10307fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint16_t WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
10313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1032e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
1033b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
1034261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1035261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
10373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
10383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
10393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
10407fab89734d88724a288e96a9996b15548c5294c7Ben Chan                             uint16_t frequency,
10413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
10423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
10433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
10463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
10473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
10493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
10503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
1051a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
10523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
10563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
10570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
1058e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
10590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
1060e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
10610654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
1062b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
10633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1065e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
1066e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
1067e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1068e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
1069e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1070e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1071a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
1072a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
1073a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
1074a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
10752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
1076a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
1077a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
10789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
10799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
10809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
10819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
10829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
1083f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
1084a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
10852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
10862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
10872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
10889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
10899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
10909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
10919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
10949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
10959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
10969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
10979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
10989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
10999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
11009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
11019f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
11029f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
11039f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
11049f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
11059f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
1106a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
1107a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
11089f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
11099f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
11109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
11119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
11129f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
11139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
11149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
11159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
11169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
11172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1118a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
11192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1120a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1121a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
11222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
11232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1124a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
11252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1126f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1127a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1128a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1129a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1130a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1131a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1132a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1133a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1134f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1135a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1136a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1137a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1138a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1139a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1140a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1141a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1142a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1143a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1144a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1145a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1146a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1147a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1148a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1149a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1150a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1151a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1152a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1153a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1154a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1155a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1156a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1157a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1158e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1159e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1160e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
11613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
11620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantInterfaceProxyFromWiFi());;
11643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
11670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantInterfaceProxyFromWiFi());
11683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11702b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
11712b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
11722b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11732b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1174227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1175227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1176227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1177227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1178227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1179227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1180227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1181227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1182227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1183227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1184227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1185227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1186227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1187227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1188227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1189227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1190227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1191227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1192227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
11932b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
11940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
11970afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
11982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1199227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1200227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1201227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1202227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1203227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1204227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1205227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1206227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
12072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
12099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
12109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
12119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
12129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
12139cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
12149cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
12152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12172b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
12180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12210afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12229cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
12239cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
12249cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
12259cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12269cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
12272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12292b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
12300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSupplicantProcessProxy());;
12312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
12330afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, GetSupplicantProcessProxy());
12342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
12372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
12382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
12412b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
12422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
12432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
12442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
12452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
12462b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
12472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1248549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
12493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
12513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
12520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
1253549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1254549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1255c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1256549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1257549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1258549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
1259ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
12603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
12613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
12623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
12633c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1265549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1266549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
12670afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
1268549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1269549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
12753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
12763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
12773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1279b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
12803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
12813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
12823239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1283b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
12843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
12853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
12865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
12875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
12885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
12895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
12905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
12915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
12925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
12935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1301835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1303835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
13040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(network, nullptr, nullptr));
13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1306835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1307835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1308835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
13090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
13100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
13110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
13120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
13130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
13140427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
13150427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1316381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1317381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1318381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
13193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1320381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1321381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1322381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1323381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1324381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1326381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1327381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1328381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1329381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1330381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1331381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1332381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1333381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1334ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1335316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1336316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1337316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1338316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1339b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1340316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1341316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1342316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1343316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1344316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1345316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1346316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1347316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1348316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1349b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1350ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1351ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1352316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  Mock::VerifyAndClearExpectations(service);
1353316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1354316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1355316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1356316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
1357b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false))
1358316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1359316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1360ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1361ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1362381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1363381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1365381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1366381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1367381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1368381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1369381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1370381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1371381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1372381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1373381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1374381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1376381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1377381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1378381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1379381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1380381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1381381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1382381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1383381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
13855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
13863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
13873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
13883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
13893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
13903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
13912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
13923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
13933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
13943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
13963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
13995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
14005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
14015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
14025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
14035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
14045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
14055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
14065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
14075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
14095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
14103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
14113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
14123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
14133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
14143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
14153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
14165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
14172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
14182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
14193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1423f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
14262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1428c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14292ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1430c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1431c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14352ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14362ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14372ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14382ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14412ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1442c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1443c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1446c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
14472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
14490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
1450c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1452c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1454c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1455c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14572ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1458c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
14592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
14602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
14612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
14622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1463c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1464c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
14682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1470c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1471c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
14725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
14732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
14742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
14752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
14762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1477f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
14782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
14792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
14802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
14892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
14902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
14912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
14922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
14942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
14952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
14962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
15002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
15015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
15022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
15032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
15040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
15055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
15065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
15072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
15082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
15105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
15122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
15132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
15142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
15152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
15165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
15172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
15195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
15212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
15225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
15255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1527ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1528ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15305c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1531ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1532ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
15335f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15345f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15352f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1536ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1537ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1538ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
15405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
15455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
15485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
15495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
15500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_NE(nullptr, scan_session_);;
15510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
15520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
15575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1559ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1560ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1562ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1563ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15642f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1565ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1566ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1567ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
15695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
15705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
15715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
15745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
15765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
15775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
15785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
15795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
15805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
15815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1583ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1584ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
15870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
15883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
15905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
15913ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1593ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
15942f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1595ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1596ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1597ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
15985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
15995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16030afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(
16040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
16055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
16065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
16075f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
16085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
16090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
16105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1611df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
16125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
16135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16168e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, ResumeWithCurrentService) {
16178e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
16188e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  SetupConnectedService(DBus::Path(), NULL, NULL);
16198e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
16208e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
16218e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, true)).Times(1);
16228e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnAfterResume();
16238e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16248e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
16258e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
16263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
16283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1629e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
16303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1631e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
16323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1633e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
16343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1635e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
16367fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint16_t frequency = 2412;
1637e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1638e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1639e41a72d0737488d561a4158019409d5785dad61bThieu Le
1640e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1641e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1642e41a72d0737488d561a4158019409d5785dad61bThieu Le
1643e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1644e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1645e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1646e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1647e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1648e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1649e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1650e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1651e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1652e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1653e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1654e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
16553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
16563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
16573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
16583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
16633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
16643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
16653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
16663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
16683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
16693c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
16723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1676b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
16770afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // BSSes with SSIDs that start with nullptr should be filtered.
1678e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1679b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1680e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1681e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
16828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
16858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
1690ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
16913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16943c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1697261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1698261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1699261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1700261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
17013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
17033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
17043c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
17060afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
17093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
17103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1711835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1712835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
17133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
17140afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
1715835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1716835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
17173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1718835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
17193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17203c5040174273386868cc8dea8044d22c465885d8Paul Stewart
17213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
17220654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1723835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1724835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1725a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
1726a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
17273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
17283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1729835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1730835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1731835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
17320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
17330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
17350afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
17373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17384943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
17394943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17404943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17414943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
17424943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
17430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17444943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
17454943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17464943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
17474943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
17484943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
17490afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
17504943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
17514943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17524943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
17560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService());;
17570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
17600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
17620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
17633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
17640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
17683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
17693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
17710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService("/new/path", nullptr, nullptr));
17723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
17763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
17773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
17800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
17820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
17830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
17850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
17862b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
17870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
17903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
17913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
17920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
17933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17944943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
17950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
17960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
17980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
17990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1800835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1801835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1802ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
1803af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
1804af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
1805af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
1806af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
1807835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1808735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
18093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
18104943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
18114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
18124943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18144943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18154943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
18164943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18174943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
18184943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
18194943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ::DBus::Path kPath("/fake/path");
18200afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18214943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18224943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
18234943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18244943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
18254943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
18264943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
18274943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18284943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
1829ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<MockSupplicantNetworkProxy> network_proxy(
18304943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
18314943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
18324943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
18334943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
18344943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false));
18354943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
18364943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
18374943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
18384943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
18390654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1844c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
18453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
18470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1849c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
18503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1851c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1852c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1853c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1854c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
18550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18560afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
1857c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1858c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
18590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
18600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
18614943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
18620afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
18634943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(),
18640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                        nullptr, nullptr));
18650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
18680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
18690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
18710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
18722b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
18734943822214f823c2437aa32b0376414b3e60388dPeter Qiu
18744943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
18754943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
18764943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
18782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
18791aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWhileRoaming) {
18801aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  StartWiFi();
18811aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  DBus::Path kPath("/fake/path");
18820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
18831aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18841aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // As it roams to another AP, supplicant signals that it is in
18851aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // the authenticating state.
18861aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
18871aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18881aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18891aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
18901aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  InitiateDisconnect(service);
18911aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18921aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Because the interface was not connected, we should have immediately
18931aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // forced ourselves into a disconnected state.
18940afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
18950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetSelectedService().get());
18961aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
18971aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  // Check calls before TearDown/dtor.
18981aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18991aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal}
19001aebe4b524e8be86f7c86c21d5ea441afd2e165dmukesh agrawal
1901d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnected) {
1902d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1903d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19040afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1905d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1906d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1907d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1908d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1909d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1910d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1911d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).Times(0);
1912d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1913d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1914d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1915d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1916d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1917d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1918d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1919d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1920d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceIdle) {
1921d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1922d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19230afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1924d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1925d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service1(SetupConnectedService(DBus::Path(),
19260afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
1927d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1928d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1929d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1930d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1931d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1932d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(false));
1933d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("is not active, no need"))).Times(1);
1934d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1935d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(0);
1936d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1937d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1938d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1939d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1940d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1941d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1942d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1943d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1944d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca SilbersteinTEST_F(WiFiMainTest, DisconnectWithWiFiServiceConnectedInError) {
1945d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  StartWiFi();
1946d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
19470afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan                                                       nullptr, nullptr));
19480afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
1949d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ResetPendingService();
1950d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  NiceScopedMockLog log;
1951d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1952d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(2);
1953d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _,
1954d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("DisconnectFromIfActive service"))).Times(1);
1955d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(*service0, IsActive(_)).WillOnce(Return(true));
1956d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(_, _, HasSubstr("DisconnectFrom service"))).Times(1);
1957d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  EXPECT_CALL(log, Log(logging::LOG_WARNING, _,
1958d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein                       HasSubstr("In DisconnectFrom():"))).Times(1);
1959d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  InitiateDisconnectIfActive(service0);
1960d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
1961d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(&log);
1962d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  Mock::VerifyAndClearExpectations(service0);
1963d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->set_verbose_level(0);
1964d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1965d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein}
1966d7cdc5e24ae65abd1bbab4d1b654b59c9f7f4289Rebecca Silberstein
196717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
19689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
196917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
197017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
19719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
19729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
197344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
197444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
197517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
197617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
197717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
19780d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
19790d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
19800d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")))
198117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
198217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
198317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
198433a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(1);
198517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
19860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
198744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
1988a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
198944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
1990a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
1991a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1992a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
19930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
19940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
19950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
199617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
199833a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  // Service state should be idle, so it is connectable again.
199933a026b3fa0c506f02f9d117948433dbf7fee39fPeter Qiu  EXPECT_EQ(Service::kStateIdle, service->state());
200017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
20010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
20020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
20030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
200417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
200517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
200617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
20072b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
20082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
20092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
20103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
20110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
20122b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
20132b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
201417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
201517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
20160d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
20170d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
20180d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("PendingTimeoutHandler")));
201917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
202017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
202117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
202217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
20240afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
20250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
20280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
20300afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
20313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
20320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
20380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service(SetupConnectedService(kPath, nullptr, nullptr));
20393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
20400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
20410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
20420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
20430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
20450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
20460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
20470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
20480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
20495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
2050c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
20513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
20530afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, nullptr));
20543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
20550afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, nullptr);
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart
20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
20580afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
20600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      .WillOnce(Return(nullptr));
20613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
2062c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
2063b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2064c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
20655c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
20665c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2067549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
20683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
20703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
20710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr));
2072ef76af866aa73abb8c16958844cb13f042881bcbBen Chan  unique_ptr<EndpointRemovalHandler> handler(
20733c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
20743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
20753c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
20773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2078549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
20790afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService());;
2080549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
2081549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
2082446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
20833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
20843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
20850afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
20863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
20871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20880654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20900654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
20911aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20920654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
2094446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
20951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
20960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
20971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
20983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
21003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
2102446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
2103446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
21045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
2105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
21060654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
2107ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
2108ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
2109ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
2110ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2111ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
2112ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
2113ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
2114ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
2115ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
2116ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
2117ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
21183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
21230654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
21243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
2125ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2126ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
21275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
21285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
21303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
21313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
21323c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
21343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
21355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
21365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
21393c5040174273386868cc8dea8044d22c465885d8Paul Stewart
21405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
21505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
2152ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21545412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _, _));
21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
21595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
21635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
21645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
21675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
21685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
21695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
21705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
21715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
21725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
21735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
21743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21753c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
21765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
21785412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _, _));
2179ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
2180ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
2181ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
2182fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
2183fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
2184fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2185fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
2186fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
21873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
21885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2189fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
2190fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
2191fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
21925f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
2193fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
2194fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
2195fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
2196fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
21971e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
21981e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
21991e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
22001e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22011e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
22021e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
22031e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal      .WillOnce(Throw(DBus::Error("don't care", "don't care")));
22041e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
22051e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
22061e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22071e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
22081e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
22159f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
22167de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
22175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
22202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
22215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2226f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2227df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2228df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2229df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2230f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
22315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
22325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
22345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
22355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
22365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
22375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
22405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
22435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
22445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
22455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
22465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
224744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
224844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
224944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
225044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
22515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
22529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
22535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
22562ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
22577de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
22585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
22635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
22645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
22655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
22665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
22675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
22685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
22700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
22715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2274a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2275a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
22765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
22770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
22780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
22820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
22830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
22842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
22852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
22862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
22875412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _, _));
22882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
22912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
22925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
22935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
22940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
22955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
22965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
22970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
22982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
22990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
23002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
23010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
23025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
23035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
23047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
23057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
23067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
23087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
23097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
23110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
23127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
23147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
23157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
23167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
23177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2318f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
23197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
23207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
23210654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
23227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
23237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
23247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2325d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
23267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
23287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
23297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
23307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
2331b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2332d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
23337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
23347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2335f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2336bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2337bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2338bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
23397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
23400654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
23410654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
23420654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
23437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
23447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
23457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
23463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
23473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
23487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
23497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2350a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
2351a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2352a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2353a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2354f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2355a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2356a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2357a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2358a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2359a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2360a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2361a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2362a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2363a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2364a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2365a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2366a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2367a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2368a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2369a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2370f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2371a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23720654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
23730654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2374a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2375a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2376a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2377a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2378a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2379a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23800afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetPendingService(nullptr);
2381a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2382a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2383a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
23842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2385a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
23860654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
23870654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2388a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
23890654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2390a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2391a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
23921590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
23931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
23960afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), &endpoint, nullptr);
23971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
23984943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
23990654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
24000afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24010afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
2402687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
24041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
24051590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
24061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
24073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
24080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
24093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
24103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
24110afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      0, 0, kNetworkModeAdHoc, nullptr, &service1));
24123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
24131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2414c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2415c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2416c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2417c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
24183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
24193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
24203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2421bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2422a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
24230654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
24243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2425687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
24273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
24281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
24291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2430e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2431e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
24320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
24330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
24340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
24353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
24360afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
24373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
24383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
24393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
24403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
24413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2442687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
24430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2444687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2445687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2446687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2447687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2448687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2449687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2450687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2451687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2452687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2453687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  Mock::VerifyAndClearExpectations(ipconfig);
2454687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
24554eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
24564eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
24578a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
24588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
24600afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
24628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
24633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
24640afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
24660afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
24678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
246949c6c4a071a3e70ade31681f435293349e79b6c9Peter QiuTEST_F(WiFiMainTest, ConnectedToUnintendedPreemptsPending) {
247049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  StartWiFi();
247149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ::DBus::Path bss_path;
247249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connecting two different services back-to-back.
247349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr unintended_service(
24740afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, &bss_path));
247549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  MockWiFiServiceRefPtr intended_service(
24760afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
247749c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
247849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service.
247949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(intended_service.get(), GetPendingService().get());
248049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
248149c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Connected to the unintended service (service0).
248249c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  ReportCurrentBSSChanged(bss_path);
248349c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
248449c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // Verify the pending service is disconnected, and the service state is back
248549c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  // to idle, so it is connectable again.
24860afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetPendingService().get());
24870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
248849c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu  EXPECT_EQ(Service::kStateIdle, intended_service->state());
248949c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu}
249049c6c4a071a3e70ade31681f435293349e79b6c9Peter Qiu
24918a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
24928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
24938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
24943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
24950afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
24968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
24978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
24988a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
24994a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
25000654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
25019d97b7deda3ae604d718873207a951f62d418b34Paul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) &&
25020654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
25034d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
25044d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
25054d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
25064d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
25073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
25080afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2509a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
25103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
25124d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
25134d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
25144d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
25154a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
25164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
25173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
25180afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, &service);
2519a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
25203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
25214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
25224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
25234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
25244a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
25254a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2526f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
25274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
25294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
25313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
25344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
25374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
25383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
25393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25440654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
25504a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
25514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
25544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
25550654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
25564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
25573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
25593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
25614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
25624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
25630654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
25654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
25664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
25674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
25684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
25694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
25704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
25715c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
25725c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
25730654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
25745c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
25753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
25765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
25773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
25785c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
25795c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
25805c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
25810654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
25825c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
25835c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
25844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
25854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2586c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2587c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
25883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
25890afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
2590c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2591c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2592c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2593c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2594c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2595c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
2596c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
2597c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2598c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2599c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2600c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
26013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
26020afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr));
26038f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2604c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
26058f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
26068f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
26070654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
26085519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
26093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
26103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
26113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
26128f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
26138f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
26145519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
26155519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
26163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
26173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
26183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
26190654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2620c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2621c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2622b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2623b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2624b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2625b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2626b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2627b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2628b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2629b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2630b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2631b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2632b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2633b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2634b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2635b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2636b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2637b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2638b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
26393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
26400afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, nullptr, nullptr));
26410afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_)).WillOnce(Return(nullptr));
26423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2643b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2645b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2646b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2647b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
26485c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
26495c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
26505c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
26515c05b2920be742d518829972127172481722058dmukesh agrawal
26525c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
26535c05b2920be742d518829972127172481722058dmukesh agrawal
26545c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
26555c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
26565c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
26573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
26585c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
26595f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(1);
26602f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
26615c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
26625c05b2920be742d518829972127172481722058dmukesh agrawal}
26635c05b2920be742d518829972127172481722058dmukesh agrawal
26645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
26655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2666b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2667b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2668b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2669b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2670b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2671b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26727de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
26730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2674b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2675b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2676b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2677b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2678b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2679b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
26805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
26815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
26825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
26845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
26855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
26860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
26885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
26895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
26905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
26915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
26925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
26935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2699b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
27035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
27130afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr);
2714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
27185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2725b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2726b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(1, nullptr);
2730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2734b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2745b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetScanInterval(0, nullptr);
2747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
27515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
27525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
27535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
27555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
27565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
27575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
2758a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
27615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
27625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
27635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
27645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
27655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
27665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2767b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2768b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2769b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
27710afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2772df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
27733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
27743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
27753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
2776a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
27773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27783c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
27795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
27800654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2782b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2786b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
27870afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
2788b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2789df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
27903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
27913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
27920654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2793b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2794b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2795b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
27963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
27973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
27982ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  auto link_monitor = new StrictMock<MockLinkMonitor>();
27992ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  StartWiFi();
28003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
28012ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
28023c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
28033c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
28043c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
28052ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
28062ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // We never had an ARP reply during this connection, so we assume
28072ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // the problem is gateway, rather than link.
28083c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
28093c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
2810daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
28113c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
28122ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28132ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
28142ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // No supplicant, so we can't Reattach.
28152ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantVanish();
28162ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
28172ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal                       EndsWith("Cannot reassociate."))).Times(1);
28182ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
28192ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnLinkMonitorFailure();
28202ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28212ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal
28222ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  // Normal case: call Reattach.
28232ef6e04b5606ff74e6aa47fe339b5d5c87ddd16amukesh agrawal  OnSupplicantAppear();
28243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2825daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
2826daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1);
28273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
28283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
28303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
28318e1ad1684e2dd34619315c14f4b5312b93de0a83Peter QiuTEST_F(WiFiMainTest, UnreliableLink) {
28328e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  StartWiFi();
28338e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  SetupConnectedService(DBus::Path(), NULL, NULL);
28348e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
28358e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetHT40Enable(_, false)).Times(1);
28368e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  OnUnreliableLink();
28378e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
28388e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu}
28398e1ad1684e2dd34619315c14f4b5312b93de0a83Peter Qiu
2840cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2841f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2842bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
28430afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2844cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2845cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2846bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
2847f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
28480654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2849bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2850bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
2851bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
28520afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
28531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2854bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
28551369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2856cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2857cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2858f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
2859f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
2860f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
2861f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
2862a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
2863f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
2864f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
2865f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2866f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
2867f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
2868f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
2869f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2870f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2871b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2872f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
2873f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
2874f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2875f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2876f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2877f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2878f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
2879f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2880f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2881f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
2882f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
2883f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
2884f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
2885f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2886f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2887f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
2888f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
2889f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2890f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2891f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
2892f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
2893f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
28940d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
28950d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
28960d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2897f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2898f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2899f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2900f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
2901f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
2902f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2903f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
29040d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
29050d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
29060d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("OnIPConfigFailure")));
2907f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2908f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2909f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2910f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
2911f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
2912f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2913f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
2914f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
29150d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan              DisconnectWithFailure(Service::kFailureBadPassphrase,
29160d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    _,
29170d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                    StrEq("OnIPConfigFailure")));
2918f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2919f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
2920f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
29211369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
2922f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
2923735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2924735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2925735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2926735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2927735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2928bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
29290afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2930bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2931bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2932bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
29331369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2934bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
29351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2936bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2937bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2938bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
29390afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
2940bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2941bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2942bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2943bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
29440afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_FALSE(SuspectCredentials(service, nullptr));
29451369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29471369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2948f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
2949cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
29500654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2951cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2952a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
2953bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2954f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
29554943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2956735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2957cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2958f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
29590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
29601369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
29611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
29621369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
2963f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
29641369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
29651369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2966735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2967735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
29684943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2969735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2970735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2971735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2972735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2973735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2974bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2975735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
29761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
297739a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
2978735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
29790654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2980cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2981cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
29841aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
29861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2987e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2988e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
29941aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
3000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
3001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
3002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
3003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
3004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
3005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
3006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
3007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
3008e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
3009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
3011e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
3012e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
3015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3016e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
3017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
3018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
3019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3020e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
3021e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
3022e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
3023e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3024e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3025e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
30261aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
30270afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // This PostTask is a result of the call to Scan(nullptr), and is meant to
3028e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
3029e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
3030e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3031e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3032e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3033e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
3034e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3035e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3036e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3037e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
3038e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
3039e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
3040e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
3041e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
3042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
3043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
3044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
3045e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
30461aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
30471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
30500afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
30511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
30581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
30641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
30671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30701aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
30711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
30721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
30731aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
30741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
30757cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
30767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
30777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
30787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
30807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
30817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
30820afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectedService(DBus::Path(), nullptr, nullptr);
30837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
30847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
30857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30865412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
30877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
30887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
30897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
30917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetCurrentService(nullptr);
30937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
30947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
30952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
30967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
30977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
30987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
30997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
31007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
31027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
31037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
31047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
31057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
31067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
31077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
31087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
31097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
31117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
31127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
31135412de0a46893b44f60fee4058c5b0d744b74b4dSamuel Tan      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _, _));
31147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
31157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
31167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
31177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
31187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
31207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
31217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
31227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3123baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
3124baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
3125baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
3126baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
31277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
31287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
31297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
31307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
31317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
31327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
31337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
31347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
31357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
31367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
31377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3138baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
31397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3140baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
3141baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
3142baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
3143baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
3144baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
3145baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
3146baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
3147baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
3148baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
3149baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
3150baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
3151baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
3152baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
3153baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
3154baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
3155baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
3156baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
3157baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
3158baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
3159baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
3160baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
3161baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
3162baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
3163baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
3164baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
3165baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
3166baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
3167baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
3168baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
3169baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3170baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
3171baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3172baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
3173baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
3174baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
3175baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3176baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
3177baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
3178baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
3179baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
3180baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
3181baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
3182baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
3183baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
3184baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3185baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3186baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3187baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
31887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
31897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
31907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
31917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
31928e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
31937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
31947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
31957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
3196baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
3197baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
3198baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
3199baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
3200baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
3201baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
3202baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
3203baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
3204baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
3205baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
3206baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
3207baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
3208baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
3209baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
3210baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
3211baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
3212baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
3213baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
3214baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
3215baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
3216baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
3217baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
3218baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
3219baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
3220baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
3221baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
3222baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
3223e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3224e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
3225e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
3226e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
3227e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3228e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
3229e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
3230e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
3231e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
3232e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
3233e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
3234e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
3235e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
3236e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
3237e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
3238e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3239e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
3240e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
3241e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
3242e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
3243e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
3244e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
3245e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
3246e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
3247e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
3248e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
3249e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
3250e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
3251e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
3252e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
3253e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
3254e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
3255e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
3256e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3257e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
3258e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
3259e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
32608e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
32618e43058d862502b49c769742f6d5e61e28286254Peter Qiu
3262e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
3263e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
3264e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
3265e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
3266e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
3267e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
32687cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
32697cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
3270bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
3271f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3272bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3273bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3274bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3275bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3276bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
3277bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3278bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3279bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3280bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3281bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3282bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3283bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3284bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
32857fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kDepth = 123;
32860654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
3287bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3288bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3289bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3290bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3291bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3292bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3293bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
32940654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
3295bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
3296bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3297bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3298db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3299db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3300db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
330111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3302db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3303db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3304735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3305735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3306735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3307735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3308db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3309db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3310db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3311f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3312db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3313735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3314db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3315735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3316735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
3317735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3318db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3319735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3320735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3321735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
33220d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange,
33230d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33240d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
3325735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
332611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
332711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  MockEapCredentials *eap = new MockEapCredentials();
332811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
332911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
333011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
333111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
333211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
333311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
333411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
333511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
333611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
33370d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing,
33380d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              _,
33390d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan                                              StrEq("EAPEventTask")));
334011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
334111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
334211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
334311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
334411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
334511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
334611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
334711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
33480d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
334911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
335011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
335111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
335211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
335311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3354bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3355bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3356c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3357c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3358c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3359c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3360c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3361c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3362c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3363c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3364c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3365c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3366c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3367c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
33686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
33696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
33706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
33716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
33726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
33737fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint16_t frequency;
33746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
33756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
33766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
33786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
33796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
33806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
33826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
33836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
33846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
33856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
33866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
33876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
33886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
33896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
33906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
33926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
33936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
33946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
33956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
33966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
33976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
33986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
33996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
34006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
34016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
34026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
34036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
34047347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
34057347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
34066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
34075581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
34085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
34095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
34115581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
34125581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
34135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
34175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
34185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34190654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
34205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
34225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
34255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
34265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34270654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
34280654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
34290654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
34300654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
34310654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
34320654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
34330654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
34340654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
34355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
34475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
34485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34490654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
34500654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
34515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
34565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
34575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34580654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
34605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
34615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
34635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
34655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
34665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
34670654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
34680654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
34695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
34735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
34745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
34755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
34765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
34775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
34785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
34795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
34805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
348150cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
348250cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
348350cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
348450cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
348550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
3486bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
3487bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
3488bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
3489bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
3490bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3491bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
34927fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const uint16_t kKnownScanInterval = 4;
3493bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3494bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
3495bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3496bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3497bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
3498bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3499bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3500bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3501bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
3502bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3503bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
35047fab89734d88724a288e96a9996b15548c5294c7Ben Chan    static const int32_t kKnownSignalThreshold = 4;
3505bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3506bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3507bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3508bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3509bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3510bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3511bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3512bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3513bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
3514bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3515bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3516bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
3517bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3518bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3519bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
3520bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
35210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
35220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35230cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
35249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
35250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
3526a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3527a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3528a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3530a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
35337de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
35340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
35350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35410cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
35429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
35430cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35459f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
35469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
35479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
35480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3550a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35510cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3552a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3553a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3554a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
35570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35640cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
35659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
35660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
35670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
35689f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
35700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3572a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
35730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3574a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3575a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3576a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
35770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
35780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
35790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
35800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
35810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
35820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
35830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
35840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
35850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
3586df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
35879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3588df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
35899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
35909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
3591df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3592df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
3593a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3594a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
3595a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
35969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3597df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3598df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3599df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3600df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
3601df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
3602df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
3603df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
3604df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3605df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3606df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3607df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3608df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3609b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
3610b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3611b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
3612df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
3613b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
3614b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3615df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
3616df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3617df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
3618df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3619a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3620df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3621b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
3622b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
3623b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
3624b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3625df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
3626df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3627df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3628df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
3629df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3630a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3631df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3632df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3633df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3634df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
3635df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3636df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3637df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
36380afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition a)
3639df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
36409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3641df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3642df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
3643a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3644a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3645df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
36460afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3647df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
3648df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3649df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
3650a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3651a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
36529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3653df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3654df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3655df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3656df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
3657df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
3658df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
36590afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan      SetupConnectingService(DBus::Path(), nullptr, nullptr));
3660df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3661df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3662df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
36630afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  EXPECT_EQ(nullptr, GetCurrentService().get());
3664df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3665a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3666a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
3667df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3668df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3669df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
36709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3671df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3672a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3673df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
3674df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
3675df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
3676df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
3677df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
3678df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3679df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3680df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3681f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
3682f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3683a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
3684df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
3685df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3686df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
3687df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3688df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3689df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
36900afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // Test for SetPendingService(nullptr), condition d) Disconnect while
36910afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  // scanning.
36920afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan
3693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
36949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3695df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3696df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
3697df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
3698a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3699a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3700f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3701df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
3702df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3703df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
3705a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3706df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3707df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3708df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3709df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3710df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3711df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3712df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3713df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
3714df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
3715f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
3716a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
3717a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
37182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
3719df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
3720a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
3721a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3722a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3723a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3724df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
3725df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
3726a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3727df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3728df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
3729a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3730df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3731df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
3732df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
3733a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3734df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3735df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3736df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3737df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
3738df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3739df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
3740df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
3741df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
3742df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3743df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
3744a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
3745df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
3746df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
3747df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3748df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3749df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3750df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3751df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
37523bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
37533bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
37540afd90f73a4a22c7d9d144d8fe5de66b30632e48Ben Chan  SetupConnectedService(DBus::Path(), nullptr, nullptr);
37553bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37563bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37573bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
37582ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37593bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
37603bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
37613bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37623bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
37637de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
37643bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
37653bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
37663bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
37673bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
37682ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
37692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
37702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
37722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
37752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
37772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
37842ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
37852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
37872ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
37882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
37892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
37902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
37912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
37922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
37932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
37942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
37952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
37962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
37972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
3798c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) {
3799df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  StartWiFi();
3800df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kPeer[] = "peer";
3801df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3802df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3803df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3804df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3805df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3806df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3807df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3808df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSDiscover(kPeer));
3809df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSDiscover(kPeer));
3810df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3811df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3812df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3813df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3814df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3815df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3816df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3817df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3818df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSSetup(kPeer));
3819df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSSetup(kPeer));
3820df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3821df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3822df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kStatus[] = "peachy keen";
3823df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3824df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return(kStatus))
3825df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3826df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3827df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3828df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3829df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ(kStatus, TDLSStatus(kPeer));
3830df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ("", TDLSStatus(kPeer));
3831df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3832df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3833df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3834df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3835df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3836df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3837df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3838df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3839df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSTeardown(kPeer));
3840df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSTeardown(kPeer));
3841df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3842df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart}
3843df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3844c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) {
3845c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  StartWiFi();
3846c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kPeer[] = "00:11:22:33:44:55";
3847c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3848c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3849c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3850c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error));
3851c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3852c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3853c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3854c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3855c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3856c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error));
3857c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // This is not a valid IP address nor is it a MAC address.
3858c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3859c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3860c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3861c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kAddress[] = "192.168.1.1";
3862c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3863c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3864c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3865c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // The provided IP address is not local.
3866c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3867c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(false));
3868c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3869c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3870c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3871c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3872c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3873c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3874c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3875c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3876c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // If the MAC address of the peer is in the ARP cache, we should
3877c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // perform the TDLS operation on the resolved MAC.
3878c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const char kResolvedMac[] = "00:11:22:33:44:55";
3879c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const ByteString kMacBytes(
3880c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac));
3881c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3882c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(true));
3883c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _))
3884c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true)));
3885c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(),
3886c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                TDLSDiscover(StrEq(kResolvedMac)));
3887c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3888c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3889c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3890c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3891c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3892c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3893c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3894c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3895c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // This is the same test as TDLSInterfaceFunctions above, but using the
3896c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // method called by the RPC adapter.
3897c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3898c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3899c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3900c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3901c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3902c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3903c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3904c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3905c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3906c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3907c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3908c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3909c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3910c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3911c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3912c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3913c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3914c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3915c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3916c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3917c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3918c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3919c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3920c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3921c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3922c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3923c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3924c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3925c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3926c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3927c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3928c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3929c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3930c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3931c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3932c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3933c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3934c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  const map<string, string> kTDLSStatusMap {
3935c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { "Baby, I don't care", kTDLSUnknownState },
3936c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState },
3937c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState },
3938c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState },
3939c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState },
3940c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  };
3941c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3942c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  for (const auto &it : kTDLSStatusMap) {
3943c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3944c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart        .WillOnce(Return(it.first));
3945c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3946c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(it.second,
3947c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3948c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3949c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3950c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3951c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3952c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3953c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3954c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3955c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3956c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3957c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3958c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3959c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3960c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3961c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3962c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3963c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3964c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3965c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3966c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3967c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3968c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3969c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3970c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3971c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3972c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3973c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3974c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3975c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3976c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3977c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3978c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3979c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3980c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
3981c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
39823946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, OnNewWiphy) {
39833946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  Nl80211Message new_wiphy_message(
39843946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      NewWiphyMessage::kCommand, NewWiphyMessage::kCommandString);
39853946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39863946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      CreateStringAttribute(Nl80211AttributeWiphyName::kName,
39873946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                            Nl80211AttributeWiphyName::kNameString);
39883946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  new_wiphy_message.attributes()->
39893946da840142cd386d628c0e879459f8976bd86dmukesh agrawal      SetStringAttributeValue(Nl80211AttributeWiphyName::kName,
39903946da840142cd386d628c0e879459f8976bd86dmukesh agrawal                              "test-phy");
39913946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), Start(_));
39923946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  OnNewWiphy(new_wiphy_message);
39933946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // TODO(quiche): We should test the rest of OnNewWiphy, which parses
39943946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  // out frequency information.
39953946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
39963946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
39973946da840142cd386d628c0e879459f8976bd86dmukesh agrawalTEST_F(WiFiMainTest, StateChangedUpdatesMac80211Monitor) {
39983946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(true)).Times(2);
39993946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
40003946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
40013946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
40023946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  EXPECT_CALL(*mac80211_monitor(), UpdateConnectedState(false));
40033946da840142cd386d628c0e879459f8976bd86dmukesh agrawal  ReportStateChanged(WPASupplicant::kInterfaceStateAssociating);
40043946da840142cd386d628c0e879459f8976bd86dmukesh agrawal}
40053946da840142cd386d628c0e879459f8976bd86dmukesh agrawal
4006397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, AddRemoveWakeOnPacketConnection) {
4007397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string1("192.168.0.19");
4008397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string2("192.168.0.55");
4009397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const string ip_string3("192.168.0.74");
4010397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr1(ip_string1);
4011397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr2(ip_string2);
4012397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  IPAddress ip_addr3(ip_string3);
4013397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  Error e;
4014397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40159c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add and remove operations will fail if WiFi device does not support
40169c73d221484fbd719072261ff288373ce866693fSamuel Tan  // pattern matching.
40179c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
40189c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40199c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40209c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40219c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveAllWakeOnPacketConnections(&e);
40229c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40239c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40249c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40259c73d221484fbd719072261ff288373ce866693fSamuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
40269c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kNotSupported);
40279c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40289c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Wake on IP address patterns not supported by this WiFi device");
40299c73d221484fbd719072261ff288373ce866693fSamuel Tan
40309c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Add operation will fail if pattern matching is supported but the max number
40319c73d221484fbd719072261ff288373ce866693fSamuel Tan  // of IP address patterns have already been registered.
40329c73d221484fbd719072261ff288373ce866693fSamuel Tan  GetWakeOnWiFiTriggersSupported()->insert(WakeOnWiFi::kIPAddress);
40339c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 0;
40349c73d221484fbd719072261ff288373ce866693fSamuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
40359c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_EQ(e.type(), Error::kOperationFailed);
40369c73d221484fbd719072261ff288373ce866693fSamuel Tan  EXPECT_STREQ(e.message().c_str(),
40379c73d221484fbd719072261ff288373ce866693fSamuel Tan               "Max number of IP address patterns already registered");
40389c73d221484fbd719072261ff288373ce866693fSamuel Tan
40399c73d221484fbd719072261ff288373ce866693fSamuel Tan  *GetWakeOnWiFiMaxPatterns() = 50;
4040397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->Clear();
4041397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4042397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr1, &e);
4043397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4044397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4045397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4046397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4047397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4048397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4049397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4050397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4051397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4052397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4053397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4054397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr3, &e);
4055397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 3);
4056397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4057397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4058397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4059397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4060397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4061397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4062397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4063397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4064397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4065397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
40669c73d221484fbd719072261ff288373ce866693fSamuel Tan  // Remove fails if no such address is registered.
4067397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr2, &e);
4068397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(e.type(), Error::kNotFound);
4069397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_STREQ(e.message().c_str(),
40709c73d221484fbd719072261ff288373ce866693fSamuel Tan               "No such IP address match registered to wake device");
4071397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4072397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4073397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveWakeOnPacketConnection(ip_addr1, &e);
4074397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 1);
4075397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4076397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4077397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4078397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4079397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  AddWakeOnPacketConnection(ip_addr2, &e);
4080397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 2);
4081397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4082397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4083397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4084397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4085397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RemoveAllWakeOnPacketConnections(&e);
4086397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_EQ(GetWakeOnPacketConnections()->Count(), 0);
4087397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr1));
4088397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr2));
4089397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Contains(ip_addr3));
4090397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4091397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4092397bd64c161a12dd20ec65ef32545980d119e4d5Samuel TanTEST_F(WiFiMainTest, RequestWakeOnPacketSettings) {
4093397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4094397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4095397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4096397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          GetWakeOnPacketConnMessage::kCommand),
4097397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4098397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  RequestWakeOnPacketSettings();
4099397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4100397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4101fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanMATCHER_P(ErrorType, type, "") { return arg.type() == type; }
4102fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
4103fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettingsWithNoWakeOnPacketRules) {
4104397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4105397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  const uint8_t kResponseNoIPAddresses[] = {
4106397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00,
4107397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00};
41085f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request
41095f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that there are no wake-on-packet rules programmed into the NIC.
4110fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  GetWakeOnPacketConnMessage msg;
4111fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kResponseNoIPAddresses));
4112fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Successful verification and consequent invocation of callback.
4113fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetSuspendActionsDoneCallback();
4114397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4115fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_FALSE(SuspendActionsCallbackIsNull());
4116fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1);
4117397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4118397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
4119fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  VerifyWakeOnWiFiSettings(msg);
4120fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Suspend action callback cleared after being invoked.
4121fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(SuspendActionsCallbackIsNull());
4122fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
4123fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Unsuccessful verification if locally stored settings do not match.
4124397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("1.1.1.1"));
41255f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41265f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41275f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
4128fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  VerifyWakeOnWiFiSettings(msg);
4129fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan}
41305f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
4131fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest,
4132fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan       VerifyWakeOnWiFiSettingsWithWakeOnPatternAndDisconnectRules) {
4133fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  ScopedMockLog log;
4134fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  const uint8_t kResponseIPV4WakeOnDisconnect[] = {
4135fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x50, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
4136fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x3C, 0x00, 0x75, 0x00,
4137fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x04, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x30, 0x00, 0x01, 0x00,
4138fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x22, 0x00, 0x02, 0x00,
4139fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4140fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4141fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x00, 0x00, 0xC0, 0xA8, 0x0A, 0x14, 0x00, 0x00};
41425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Create a non-trivial Nl80211 response to a NL80211_CMD_GET_WOWLAN request
41435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // indicating that that the NIC wakes on packets from 192.168.10.20 and on
41445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // disconnects.
4145fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  GetWakeOnPacketConnMessage msg;
4146fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  msg.InitFromNlmsg(
4147fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      reinterpret_cast<const nlmsghdr *>(kResponseIPV4WakeOnDisconnect));
4148fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Successful verification and consequent invocation of callback.
4149fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetSuspendActionsDoneCallback();
4150fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_FALSE(SuspendActionsCallbackIsNull());
41515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(IPAddress("192.168.10.20"));
41525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
41535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
4154fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1);
41555f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
41565f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
4157fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  VerifyWakeOnWiFiSettings(msg);
4158fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Suspend action callback cleared after being invoked.
4159fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(SuspendActionsCallbackIsNull());
4160fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
4161fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Unsuccessful verification if locally stored settings do not match.
41625f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->erase(WakeOnWiFi::kDisconnect);
4163397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4164397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("structure detected")));
4165fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  VerifyWakeOnWiFiSettings(msg);
4166fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan}
4167fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
4168fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, VerifyWakeOnWiFiSettingsSuccessWithNoSuspendCallback) {
4169fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  ScopedMockLog log;
4170fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  const uint8_t kResponseNoIPAddresses[] = {
4171fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00,
4172fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      0x00, 0x00, 0x57, 0x40, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00};
4173fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Create an Nl80211 response to a NL80211_CMD_GET_WOWLAN request
4174fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // indicating that there are no wake-on-packet rules programmed into the NIC.
4175fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  GetWakeOnPacketConnMessage msg;
4176fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  msg.InitFromNlmsg(reinterpret_cast<const nlmsghdr *>(kResponseNoIPAddresses));
4177fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Successful verification, but since there is no suspend action callback
4178fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // set, no callback is invoked.
4179fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(SuspendActionsCallbackIsNull());
4180fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(GetWakeOnPacketConnections()->Empty());
4181fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(_)).Times(0);
4182fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4183fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("successfully verified")));
4184fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  VerifyWakeOnWiFiSettings(msg);
4185397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4186397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4187fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsLessThanMaxRetries) {
4188397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  ScopedMockLog log;
4189fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Max retries not reached yet, so send Nl80211 message to program NIC again.
4190fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries - 1);
4191397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4192397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4193397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4194397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4195397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
4196fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  RetryApplyWakeOnWiFiSettings();
4197fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_EQ(GetNumSetWakeOnPacketRetries(), WiFi::kMaxSetWakeOnPacketRetries);
4198fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan}
4199397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4200fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsMaxAttemptsWithCallbackSet) {
4201fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  ScopedMockLog log;
4202fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Max retry attempts reached. Suspend actions done callback is set, so it
4203fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // is invoked.
4204fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries);
4205fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetSuspendActionsDoneCallback();
4206fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_FALSE(SuspendActionsCallbackIsNull());
4207fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kOperationFailed)))
4208fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan      .Times(1);
4209397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _, _)).Times(0);
4210397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4211397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached")));
4212fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  RetryApplyWakeOnWiFiSettings();
4213fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(SuspendActionsCallbackIsNull());
4214fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_EQ(GetNumSetWakeOnPacketRetries(), 0);
4215fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan}
4216fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan
4217fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel TanTEST_F(WiFiMainTest, RetryApplyWakeOnWiFiSettingsMaxAttemptsWithCallbackUnset) {
4218fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  ScopedMockLog log;
4219fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // If there is no suspend action callback set, no suspend callback should be
4220fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // invoked.
4221fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  SetNumSetWakeOnPacketRetries(WiFi::kMaxSetWakeOnPacketRetries);
4222fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(SuspendActionsCallbackIsNull());
4223fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(_)).Times(0);
4224fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
4225fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(log, Log(_, _, EndsWith("max retry attempts reached")));
4226fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  RetryApplyWakeOnWiFiSettings();
4227397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4228397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
42295f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, ApplyWakeOnWiFiSettings) {
4230fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  // Disable wake on WiFi if there are no wake on WiFi triggers registered.
42315f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
42325f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
42335f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
42345f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
42355f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(0);
4236397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(netlink_manager_,
42375f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
42385f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
42395f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
42405f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // Otherwise, program the NIC.
42415f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
42425f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
42435f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
42445f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnPacketConnections()->Empty());
42455f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(
42465f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      netlink_manager_,
42475f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
42485f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
42495f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan                         _, _, _)).Times(1);
42505f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
42515f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(0);
42525f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  ApplyWakeOnWiFiSettings();
42535f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
4254397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
42555f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiSettingsAppliedBeforeSuspend) {
42563f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan  // When wake_on_packet_connections_ is empty, do not program the NIC and
42573f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan  // immediately invoke the callback to report success.
4258fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
42593f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan  EXPECT_CALL(*this, SuspendCallback(ErrorType(Error::kSuccess))).Times(1);
42603f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan  EXPECT_CALL(
42613f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan      netlink_manager_,
42623f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
42633f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
42643f97f110b50ad16a5b76e6328551b0697a5ad601Samuel Tan                         _, _, _)).Times(0);
42655f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
4266fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  dispatcher_.DispatchPendingEvents();
42675f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
42685f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  // When wake_on_packet_connections_ is not empty, program NIC to wake on
42695cce42f7250f04fd114c6312d456a7d6d3aa055fSamuel Tan  // IP address patterns.
42705f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  IPAddress ip_addr("1.1.1.1");
42715f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnPacketConnections()->AddUnique(ip_addr);
4272fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  EXPECT_CALL(*this, SuspendCallback(_)).Times(0);
4273397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan  EXPECT_CALL(
4274397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      netlink_manager_,
4275397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan      SendNl80211Message(IsNl80211Command(kNl80211FamilyId,
4276397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                                          SetWakeOnPacketConnMessage::kCommand),
4277397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan                         _, _, _)).Times(1);
42785f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnBeforeSuspend();
4279fbe8d2b361a51e89fcf1207050729be86a961f5fSamuel Tan  dispatcher_.DispatchPendingEvents();
42805f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_FALSE(GetWakeOnWiFiTriggers()->empty());
42815f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->find(WakeOnWiFi::kIPAddress) !=
42825f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              GetWakeOnWiFiTriggers()->end());
42835f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan}
42845f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan
42855f4b175bca4a997f186010c177c44489c8ae95b4Samuel TanTEST_F(WiFiMainTest, WakeOnWiFiDisabledAfterResume) {
42865f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kDisconnect);
42875f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  GetWakeOnWiFiTriggers()->insert(WakeOnWiFi::kIPAddress);
42885f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_CALL(netlink_manager_,
42895f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan              SendNl80211Message(IsDisableWakeOnWiFiMsg(), _, _, _)).Times(1);
42905f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  OnAfterResume();
42915f4b175bca4a997f186010c177c44489c8ae95b4Samuel Tan  EXPECT_TRUE(GetWakeOnWiFiTriggers()->empty());
4292397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan}
4293397bd64c161a12dd20ec65ef32545980d119e4d5Samuel Tan
4294853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
4295