wifi_unittest.cc revision 7347bf2b466ae8058e47b29aaf0583390405d866
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
1660ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov#include <base/file_util.h>
177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include <base/memory/ref_counted.h>
18dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h>
193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h>
204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov#include <base/string_split.h>
213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h>
225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include <base/stringprintf.h>
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
257156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h>
262ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h>
27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
28853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
318ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov#include "shill/mock_dbus_manager.h"
36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
37c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
40e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
413c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
42cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
432ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
443426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
45bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h"
4610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
475c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h"
49a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
50b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
51735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h"
523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
53835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
555c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
563c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h"
59dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h"
61853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h"
6485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
663239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
67ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
69ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
700e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
71853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
72853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
763c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
78a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
79cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
81b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
82549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
88dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
89d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
91ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
92ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
93a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
94a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
95a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
96853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
988ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
1085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
1133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
1143426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
1153c5040174273386868cc8dea8044d22c465885d8Paul Stewart                         NULL, NULL, manager(), "wifi", "", 0)) {
116853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
1173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
119853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
1208abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
121853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
122853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
124de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
125de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
126853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
127853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1286bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
129a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
130a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1316bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
132de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
133a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
134a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
135a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
136a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
137a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
138a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1396bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1406bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1416bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1426bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
143a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
144853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
145a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
146a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1476bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1496bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1506bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
151bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
1529d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
153a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
154853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1554d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1564d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1576bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1594d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1604d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1610654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
1624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1634d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1654d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1676bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1694d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1714d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1754a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1760654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
1778abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
181e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
182e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
183e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1850654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
1868abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1878abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1886bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1898abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1908abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1918abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1920654ece95920696c530ce1c0344365eb741f7efePaul Stewart          WPASupplicant::kNetworkBgscanMethodLearn),
1938abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1940654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
195e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
196e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
1988abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1998abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
2008abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
201e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
202e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
2034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
2044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
2058abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
2068abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2073c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
2083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
2093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
2103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
2113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
2123c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
215e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
2163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
217bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  explicit WiFiObjectTest(EventDispatcher *dispatcher)
218e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
2196c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(NULL),
220e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
221e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
222626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
223e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2243426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
225626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
226626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
227626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
228626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
2293c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
230dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
231b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
232b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
233f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
234d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart                                        kDeviceName)),
2352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov        dbus_manager_(new NiceMock<MockDBusManager>()),
236735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
2373c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
2389413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart            new NiceMock<MockSupplicantInterfaceProxy>()),
2392f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal        proxy_factory_(this) {
2405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
242c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
243d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
244c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
245c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
246c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
247835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)).
248835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart        WillByDefault(InvokeWithoutArgs(
249835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart            this, &WiFiObjectTest::CreateSupplicantNetworkProxy));
250318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
251ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
252735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
253735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
254735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
2552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2575c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
258bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
2595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
2605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
2625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
2635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
2645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
2655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
2663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2675c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2685c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2693ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2703ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
271d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
272ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2735c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2745c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
2753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
2762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
277b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2795c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2805c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
2813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
2823c5040174273386868cc8dea8044d22c465885d8Paul Stewart       .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
2839a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
284b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
285b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
286b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
287ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2919a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2925c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
2933ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
2943ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
295d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
296f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
297f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
298549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
299549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
300549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
301549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
302549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
303c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
304c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
305c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
306c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
30717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
30817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart    SetPendingService(NULL);
30917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
310c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
3115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
3125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
3135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
3165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
3175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
3185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
3215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
3225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
3235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
3245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
3275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
3285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
3315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
3325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    std::set<uint16_t> available_frequencies;
3335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
3345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
3355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
3365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
3375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
3385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
3395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
3415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        null_callback);
3445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
3485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3527347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  void OnTriggerScanResponse(const Nl80211Message &message) {
3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
3577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
3587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
3593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
3603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
361e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    explicit TestProxyFactory(WiFiObjectTest *test);
3623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
3641830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
365dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
3663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
3673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
369196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart        SupplicantEventDelegateInterface */*delegate*/,
3701830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
3711830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
372dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
3733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
3743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
375b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
376b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
377b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
378b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
379b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
380b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
381835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    MOCK_METHOD2(CreateSupplicantNetworkProxy,
382835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                 SupplicantNetworkProxyInterface *(
383835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const DBus::Path &object_path,
384835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const char *dbus_addr));
385835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
3863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
387b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
388b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
389b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
390b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
391b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
392b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
393b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
394e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    WiFiObjectTest *test_;
3953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
3963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Simulate the course of events when the last enpoint of a service is
3983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
3993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
400bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
401bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
402bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
403bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
404bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
405bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
406bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        const WiFiEndpointConstRefPtr &endpoint) {
407bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
408bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
409bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
4103c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4113c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
4123c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
417bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      const WiFiServiceRefPtr &service) {
4183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
4193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
420b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
421b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
422b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
4233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
4243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
4253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *ssid = base::StringPrintf("ssid%d", bss_counter_);
4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *path = base::StringPrintf("/interface/bss%d", bss_counter_);
4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_);
4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart        flimflam::kModeManaged,
4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         uint16 frequency,
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart      uint16 frequency,
4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    map<string, ::DBus::Variant> params;
5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->ConnectTo(service, params);
5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!network_path.empty()) {
5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillOnce(Return(network_path));
5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5533c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
5660654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
572b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
573b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
574b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
5755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void TriggerFullScan() {
57668d4109ff0176f7e5a9b67b916478d638aac577aWade Guthrie    wifi_->Scan(Device::kFullScan, NULL);
577c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
5781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
5791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
5801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
581bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
582bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
583bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
5843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
585165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
5863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
5881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
5891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5902b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
5912b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
5922b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
5931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
594446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
595446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
5961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
5971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
5981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
599b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
600b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
601b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
603e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
6043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
6053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
6063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
6073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
6098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
6108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
6113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
6133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
6143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
6153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
6163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
6173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
6183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
6193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
620835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() {
621835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return new NiceMock<MockSupplicantNetworkProxy>();
622835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
6247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
6257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
626835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
627835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
628835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6290427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
6300427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
6310427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
632381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
633381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
634381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
635261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
6363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
6373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
6383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
6393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
640e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
6413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
642c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
64379d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
644c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
645f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
646f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
647f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
6495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
6505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
6525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
6535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
6545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
656dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
6573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
6591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
6601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
6627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
6637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
6645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
6655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
6665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
667cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
668cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    wifi_->pending_service_ = service;
669cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
670bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
671bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
672b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
673e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
674e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
675e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
6762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
6772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
678b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
6793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
6812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
6822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6832f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
6842f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
6852f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
6862f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
6872f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
6882f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
6892b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
6902b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantAppear(":1.7");
6912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
6922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
6942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantVanish();
6952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
6962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
6982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
6992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
7044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        flimflam::kBgscanMethodProperty,
7054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
7094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
7104a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
7114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
7124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
714bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
715bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
716bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
71710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
718db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
719db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
720db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
721db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
722e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
723e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
724e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
725e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
7261aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
7271aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
7281aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7291aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7301aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
7311aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
7321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
7353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
7363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7373c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
7381369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  bool SuspectCredentials(const WiFiService &service,
7391369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
7401369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
7411369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
7421369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
7433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
7443c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
7453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7463c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
747bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanShortInterval(const uint16 &interval, Error *error) {
748bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
749bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
750bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
751bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanSignalThreshold(const int32 &threshold, Error *error) {
752bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
753bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
754bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
75510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
75610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
75710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
75810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
75985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
76085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
76185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
76285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
7633239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
7643239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
7653239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
766d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
767d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
768d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
769d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
770d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
771d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
772d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
773d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
774d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
7753239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
7763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
7773239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
7783239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
779b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
780b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
781b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
782b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
7833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
7843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
7853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
7863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
787e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
7885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
7895c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
7905c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
7913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
793dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
7943426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
795f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
7962ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
797c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
7983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
7993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
8003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
8013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
8033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
8043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
8053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
806626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
8073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
8083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
809446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
810446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
8113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
812dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
813b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
814f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
815f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
816735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
817735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
818735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
819735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockDBusManager *dbus_manager_;
820735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
821bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
8223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
825835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  NiceMock<TestProxyFactory> proxy_factory_;
8263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
8273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
828e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
829e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
830e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
831e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
832446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
833446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
8343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
835e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
836b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
837261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
838261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
839e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
8403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
8413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
8423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
843e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
8443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
8453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
8463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
8493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
8503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
8513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
8533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
8543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
8553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
8563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
8583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
8593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
8600654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
861e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
8620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
863e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
8640654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
865b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
8663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
868e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
869b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
870b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
871b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
872b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
873b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
874b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
875b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
876e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
877e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
878e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
879e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
880e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
881e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
882e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
883e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
884e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
8853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
8863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
8883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
8903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
8913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
8923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8942b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
8952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
8962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8982b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
8992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _));
9022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
9032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
9062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
9079cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
9089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
9099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
9109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
9119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
9129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
9132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9152b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
9162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
9192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9209cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
9219cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
9229cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
9239cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
9249cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
9252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9272b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
9282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
9312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
9322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
9332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
9352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
9362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
9372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9392b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
9402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
9412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
9422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
9432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
9442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9452b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
946549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
9473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
9483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
9493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
9503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
951549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
952549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
953c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
954549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
955549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
956549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
9573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
9583c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
9593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
9603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
9613c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
9623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
963549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
964549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
965549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
966549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
967549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
9685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
9695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
9703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
9723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
9753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
9763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
977b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
9783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
9803239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
981b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
9823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
9855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
9865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
9875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
9885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
9895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
9905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
9915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
9925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
9935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
9945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
9955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
9965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
9975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
9985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
999835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
10003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1001835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
10023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
10033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1004835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1005835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1006835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
10070427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
10080427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
10090427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
10100427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
10110427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
10120427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
10130427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1014381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1015381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1016381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
10173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1018381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1019381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1020381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1021381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1022381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
10233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1024381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1025381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1026381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1027381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1028381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1029381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1030381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1031381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1032ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1033ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1034ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1035ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1036ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1037ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1038381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1039381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
10403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1041381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1042381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1043381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1044381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1045381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1046381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1047381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1048381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1049381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1050381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
10513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1052381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1053381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1054381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1055381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1056381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1057381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1058381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1059381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
10605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
10615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
10623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
10633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
10643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
10653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
10663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
10672b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
10683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
10693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
10703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10713239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
10723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
10755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
10765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
10775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
10785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
10795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
10805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
10815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
10825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
10835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
10845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
10855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
10863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
10873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
10883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
10893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
10935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1094c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  StartWiFi();
10953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
10963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
10973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
10983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1099c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(service);
1100c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // If we're connecting, we ignore scan requests to stay on channel.
11013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1102c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1104c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1105c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
11073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
1108c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1110c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1111c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1113c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
1114c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(NULL);
1115c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
11163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1117c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1119c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1120c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1122c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
11233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
1124c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1126c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1127c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1129c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1130c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
11315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
11325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
11335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
11345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
11375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
11385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // If we're connecting, we ignore scan requests to stay on channel.
11395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
11405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
11425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
11435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
11465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
11475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
11495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
11505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
11535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
11545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(NULL);
11555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
11565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
11575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
11595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
11605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
11635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // But otherwise we'll honor the request.
11645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
11655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
11675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
11685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
11715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
11725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
11735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
11745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
11753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1176ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1177ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
11783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11795c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1180ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1181ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
11822f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1183ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1184ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1185ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
11865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
11875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
11885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
11895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
11925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
11935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
11955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
11965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
11985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
11995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
12005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1202ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1203ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
12043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1205ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1206ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12072f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1208ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1209ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1210ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
12115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
12125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
12175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
12195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
12205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
12235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
12245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1226ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1227ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
12303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
12313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
12323ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
12333ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
1234ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12352f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1236ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1237ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1238ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
12395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
12405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
12455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
12465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
12475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
12495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
12515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
12525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
12553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
12563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
12573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1258e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
12593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1260e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
12613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1262e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
12633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1264e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1265e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
1266e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1267e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1268e41a72d0737488d561a4158019409d5785dad61bThieu Le
1269e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1270e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1271e41a72d0737488d561a4158019409d5785dad61bThieu Le
1272e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1273e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1274e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1275e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1276e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1277e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1278e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1279e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1280e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1281e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1282e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1283e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
12843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
12853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
12863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
12873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
12883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
12893c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
12903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
12913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
12923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
12933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
12943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
12953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
12963c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
12973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
12983c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
12993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
13003c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
13013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
13023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
13033c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1305b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1306e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
1307e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1308b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1309e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1310e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
13118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
13128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
13138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
13148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
13153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
13163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
13173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
13183c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
13193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
13203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
13213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
13223c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
13233c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
13248a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
13253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1326261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1327261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1328261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1329261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
13303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
13313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
13323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
13333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
13343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
13353c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
13363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
13373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
13383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1340835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1341835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
13423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
13433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1344835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1345835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
13463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1347835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
13483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13493c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
13510654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1352835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1353835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1354835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // with this service.
13553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
13563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1357835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1358835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1359835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
13600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
13610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
13623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
13633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
13643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
13653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
13663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
13670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
13683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
13690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
13700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
13710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
13720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
13730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
13743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
13763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
13773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
13780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
13793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
13803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
13813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
13823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
13833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
13843c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService("/new/path", NULL, NULL));
13853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
13870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
13880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
13893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
13903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
13910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
13923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
13930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
13940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
13950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
13960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
13970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
13983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
13992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
14000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
14010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
14033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
14043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
14053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
14063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
14080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
14100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
14110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1412835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1413835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1414835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy();
1415835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy(
14160654ece95920696c530ce1c0344365eb741f7efePaul Stewart      kPath, WPASupplicant::kDBusAddr))
1417835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart      .WillOnce(Return(network_proxy));
1418835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1419735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
14203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
14210654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
14223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
14233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
14250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1426c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
14273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
14283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
14293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
14303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1431c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
14323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1433c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1434c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1435c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1436c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
1437c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, GetCurrentService().get());
1438c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, wifi()->selected_service().get());
1439c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1440c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
14410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
14420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
14433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL));
14443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL));
14450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
14460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
14473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
14480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
14490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
14510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
14522b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
14532b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
14542b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
145517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
145617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  StartWiFi();
145717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
145817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
145917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  MockWiFiServiceRefPtr service(
146017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
146117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
146217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
146317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
146417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _))
146517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
146617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
146717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
146817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0);
146917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
147017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
147117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
147217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
147317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
147417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
14752b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
14762b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
14772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
14783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
14793c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
14802b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
14812b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
148217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
148317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
14843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
148517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
148617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
148717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
148817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
149017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
14910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
14920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
14940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
14953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
14963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
14973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
14980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
14990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
15000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
15010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
15023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
15043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
15053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
15060ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
15070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
15080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
15090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
15103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
15110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
15123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
15130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
15140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
15155c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1516c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
15173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
15183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
15193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
15203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
15213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
15223c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
15243c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
15253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
15263c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
15273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1528c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1529b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1530c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
15315c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
15325c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1533549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
15343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
15353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
15363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
15373c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
15393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
15403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
15423c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
15433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1544549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
1545549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1546549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1547549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
1548446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
15493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
15503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
15523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
15531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
15540654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
15551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
15560654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
15571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
15580654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
15591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1560446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
15611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
15620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
15631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
15643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
15663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1568446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
1569446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
1570cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
15715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
1572a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
15730654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
1574ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1575ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1576ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1577ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1578ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1579ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1580ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1581ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1582ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1583ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1584ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
15863c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
15873c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
15900654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
15913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
1592ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1593ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
15945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
15955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
15983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
15993c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
16025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
16035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
16053c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
16063c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
16085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
16095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
16105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
16115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
16125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
16135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
16145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
16155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
16165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
16175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16187347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
16197347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _));
16205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
1621ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
16225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
16237347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _));
16245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
16285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
16295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
16315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
16325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
16335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
16375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
16385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
16395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
16405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
16415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
16425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
16437347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
16447347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _));
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
16463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
16475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
16497347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _));
1650ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1651ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1652ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1653fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1654fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
1655fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1656fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
1657fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
16595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
1660fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
1661fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
1662fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
1663fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
1664fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
1665fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
1666fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
16675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
16685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
16695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
16705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
16715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
16735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
16755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
16775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
16795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
16805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
16825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
16845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
16855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
16865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
16885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
16895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
16905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
16915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
16925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
16935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
16945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
16955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
16965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
16975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
16985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
16995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
17005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
17015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
17025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
17045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
17085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
17105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
17135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
17155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
17165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
17175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
17185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
17195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
17205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
17235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
17245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
17255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
17265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
17295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession so I can get an actual ScanSession.
17305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
17315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This should call |Scan| which posts |ScanTask|
17345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
17355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
17365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
17385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
17395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
17437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
17447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
17457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
17467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
17477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
17480654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
17490654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
17507ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
17517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
17527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
17537ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
17547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
17557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1756cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
17577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
17587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
17590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
17607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
17617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
17627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1763d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
17647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
17657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
17667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
17677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
17687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1769d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1770d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
17717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
17727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1773cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
17742b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1775d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
17767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
17770654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
17780654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
17790654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
17807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
17817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
17827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
17833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
17843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
17857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
17867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1787a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
1788a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1789a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1790a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1791a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1792a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
1793a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
1794a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1795a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
1796a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1797a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1798a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1799a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
1800a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
1801a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
1802a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1803a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1804a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1805a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1806a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1807a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1808a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
18090654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
18100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
1811a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
1812a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1813a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
1814a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1815a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
1816a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1817a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetPendingService(NULL);
1818a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
1819a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1820a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
1821a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // level of supplciant debugging.
1822a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
18230654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
18240654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
1825a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
18260654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1827a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1828a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
18291590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
18301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
18313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
18323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
18333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL);
18341590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
18353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle));
18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown));
18370654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
18391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
18401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
18411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
18421590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
18431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
18443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
18453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
18463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
18473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
18483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      0, 0, kNetworkModeAdHoc, NULL, &service1));
18493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
18501590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1851c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1852c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1853c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1854c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
18553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
18563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
18573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
18580654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
18593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
18603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
18613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
18621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
18631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1864e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1865e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
18663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
18673c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
18683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
18693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
18703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
18713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
18723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
18734eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
18744eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
18758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
18768a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
18773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
18783c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
18793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
18808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
18823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
18833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
18843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
18858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
18868a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
18878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
18888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
18898a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
18903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
18913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
18928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
18938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
18948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
18954a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
18960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
18970654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
18984d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
18994d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
19004d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
19014d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
19023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
19033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
19043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
19050654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
19064d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
19074d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
19084d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
19094a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
19104a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
19113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
19123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
19133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
19144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
19154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
19164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
19174a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
19184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
19193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
19204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
19214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
19224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
19233c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
19243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
19253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
19260654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
19274a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
19284a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
19294a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
19304a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
19313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
19323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
19333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
19344a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
19354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
19364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
19370654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
19384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
19394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
19404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
19414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
19424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
19434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
19444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
19454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
19464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
19474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
19480654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
19494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
19503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
19513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
19523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
19534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
19544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
19554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
19560654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
19574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
19584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
19594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
19604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
19614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
19624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
19634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
19645c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
19655c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
19660654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
19675c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
19683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
19695c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
19703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
19715c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
19725c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
19735c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
19740654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
19755c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
19765c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
19774a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
19784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1979c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1980c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
19813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
19823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
1983c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1984c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1985c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1986c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1987c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1988c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1989c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1990c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1991c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1992c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1993c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
19943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
19953c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
19968f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
1997c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
19988f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
19998f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
20000654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
20015519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
20023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
20043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
2005ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu  string portal_url;
2006ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu  EXPECT_CALL(*manager(), GetPortalCheckURL()).WillOnce(ReturnRef(portal_url));
20078f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
20088f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
20095519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
20105519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
20113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
20123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
20133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
20140654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2015c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2016c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2017b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2018b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2019b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2020b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2021b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2022b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2023b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2024b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2025b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2026b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2027b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2028b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2029b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2030b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2031b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2032b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2033b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
20343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
20353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2039b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2040b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2041b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2042b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2043b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
20445c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
20455c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
20465c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
20475c05b2920be742d518829972127172481722058dmukesh agrawal
20485c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
20495c05b2920be742d518829972127172481722058dmukesh agrawal
20505c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
20515c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
20525c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
20533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
20545c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
20552f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
20565c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
20575c05b2920be742d518829972127172481722058dmukesh agrawal}
20585c05b2920be742d518829972127172481722058dmukesh agrawal
20595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
20605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2061b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2062b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2063b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2064b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2065b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2066b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2067b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2068b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2069b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2070b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2071b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2072b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
20735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
20745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
20755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
20775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
20785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
20795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
20805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
20815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
20835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2085b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2086b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2087b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2088b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2089b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2090b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2091b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2092b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2093b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
20945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2095b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2096b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2097b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2098b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2099b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2100b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2101b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2102b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
21033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
21043c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL);
2105b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2106b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2107b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2108b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
21095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2110b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2111b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2112b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2113b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2114b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2115b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2116b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2117b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2118b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2119b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2120bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(1, NULL);
2121b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2122b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2123b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2124b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2125b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2126b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2127b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2128b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2129b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2130b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2131b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2132b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2133b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2134b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2135b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2136b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2137bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(0, NULL);
2138b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2139b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2140b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
21415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
21425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
21435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
21445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetupConnectedService(DBus::Path(), NULL, NULL);
21465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
21475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
21485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
21495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
21515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
21525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
21535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
21545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
21555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
21565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2157b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2158b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2159b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
21605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
21623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
21633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
21643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
21653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
21675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
21680654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2169b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2170b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2171b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2172b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2173b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2174b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
21753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
2176b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
21775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
21783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
21793c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
21800654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2181b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2182b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2183b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
21843c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
21853c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  StartWiFi();
21863c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
21873c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
21883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
21893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
21903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
21913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
21923c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
21933c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
21943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
21953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
21963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
21973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
21983c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Called Reassociate()."))).Times(1);
21993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
22003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
22013c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnSupplicantVanish();
22023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
22033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
22043c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
22053c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Cannot reassociate."))).Times(1);
22063c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
22073c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
22083c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
2209cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
22103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
22110654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2212cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
22131369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
2214cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2215cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2216cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
22173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
22180654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2219cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
22201369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
22211369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
22221369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2223cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2224cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2225cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
22263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
22270654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2228cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  service->has_ever_connected_ = true;
22291369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
2230cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2231cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
22321369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
22333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2234735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2235735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2236735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2237735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2238735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
22391369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = false;
22401369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
22411369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
22421369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
22431369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2244735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  service->has_ever_connected_ = true;
2245735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
22461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
22471369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
22481369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
22491369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2250cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2251cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
22520654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2253cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
2254cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2255f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
225656e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
225756e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetState(_)).Times(0);
2258735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2259cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
22601369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
22611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(flimflam::kErrorBadPassphrase)));
22620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22631369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
22641369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
22651369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
22661369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
22671369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
22681369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(service->has_ever_connected());
22691369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2270735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2271735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
22721369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
22731369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(0);
2274735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2275735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2276735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2277735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2278735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2279735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
22801369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
22811369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(shill::kErrorEapAuthenticationFailed)));
2282735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
22830654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2284cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2285cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2286e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2287e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
22881aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2289e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
22901aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2291e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2292e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2293e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2294e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2295e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2296e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2297e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
22981aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2299e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2300e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2301e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2302e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2303e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
2304e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
2305e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
2306e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
2307e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
2308e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
2309e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
2310e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
2311e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2312e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
2313e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2314e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
2315e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
2316e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2317e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2318e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
2319e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2320e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
2321e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2322e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2323e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2324e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
2325e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
2326e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
2327e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
2328e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2329e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
23301aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
2331e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
2332e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
2333e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
2334e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2335e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2336e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2337e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
2338e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2339e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2340e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2341e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
2342e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2343e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2344e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2345e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
2346e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2347e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2348e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2349e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
23501aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
23511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
23521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
23533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
23543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
23551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
23561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
23571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
23581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
23591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
23601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
23611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
23621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
23631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
23641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
23651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
23661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
23671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
23681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
23691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
23701aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
23711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
23721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
23731aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
23741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
23751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
23761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
23771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
23781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
2379bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
2380bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2381bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2382bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2383bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
2384bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2385bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
2386bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2387bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2388bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2389bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
2390bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2391bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2392bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2393bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2394bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
23950654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2396bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2397bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
2398bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2399bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2400bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2401bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2402bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
24030654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
2404bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
2405bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2406bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2407db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
2408db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2409db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
2410db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
2411db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2412735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
2413735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
2414735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
2415735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2416db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2417db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2418db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2419735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2420db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2421735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
2422db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
2423735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2424735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
2425735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
2426db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2427735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
2428735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
2429735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
2430735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
2431735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2432bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
2433bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2434c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2435c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
2436c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
2437c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
2438c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
2439c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
2440c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2441c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
2442c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
2443c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
2444c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
2445c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
244660ceaf336297ce536201a82e350c697f1a5b546dDarin PetkovTEST_F(WiFiMainTest, VerifyPaths) {
2447196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart  string path(WPASupplicant::kSupplicantConfPath);
244860ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  TrimString(path, FilePath::kSeparators, &path);
244960ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
245060ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov}
245160ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov
24526d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
24536d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
24546d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
24556d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
24566d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
24576d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  uint16 frequency;
24586d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
24596d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
24606d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
24616d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
24626d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
24636d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
24646d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
24656d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
24666d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
24676d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
24686d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
24696d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
24706d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
24716d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
24726d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
24736d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
24746d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
24756d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
24766d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
24776d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
24786d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
24796d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
24806d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
24816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
24826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
24836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
24846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
24856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
24866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
24876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
24887347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
24897347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
24906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
24915581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
24925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
24935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
24945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
24955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
24965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
24975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
24985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
24995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
25015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
25025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
25030654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
25045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
25055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
25065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
25075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
25095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
25105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
25110654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
25120654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
25130654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
25140654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
25150654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
25160654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
25170654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
25180654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
25195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
25205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25285581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
25295581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
25315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
25325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
25340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
25355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
25365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
25385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
25405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
25415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
25420654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
25430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
25445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
25455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
25475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
25495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
25505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
25510654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
25520654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
25535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
25545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
25575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
25585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
25595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
25605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
25615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
25625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
25635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
25645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
256550cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
256650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
256750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
256850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
256950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
2570bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
2571bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
2572bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
2573bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
2574bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2575bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2576bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const uint16 kKnownScanInterval = 4;
2577bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
2578bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
2579bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2580bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
2581bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
2582bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2583bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2584bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
2585bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
2586bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2587bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2588bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const int32 kKnownSignalThreshold = 4;
2589bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
2590bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
2591bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2592bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
2593bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
2594bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2595bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2596bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
2597bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
2598bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2599bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2600bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
2601bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2602bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2603bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
2604bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
2605853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
2606