wifi_unittest.cc revision 7de7e02e14074989757a4f9f220de2310cc05236
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"
350cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov#include "shill/mock_dbus_manager.h"
37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
38c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
40f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
41e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
43cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
442ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
453426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
46bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie#include "shill/mock_netlink_manager.h"
4710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
485c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h"
50a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
51b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
52735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h"
533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
54835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
565c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
573c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h"
60dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h"
62853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h"
6585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
68ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
69853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
70ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
710e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
72853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
773c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
79a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
80cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
83b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
84549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
90dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
91d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
92853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
93ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
94ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
95a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
96a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
97a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
98853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
1008ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
102853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
103853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
1125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
114853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
1153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
1163426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
1173c5040174273386868cc8dea8044d22c465885d8Paul Stewart                         NULL, NULL, manager(), "wifi", "", 0)) {
118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
1193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
120853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
121853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
1228abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
123853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
124853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
126de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
127de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
128853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
129853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1306bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
131a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
132a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1336bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
134de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
135a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
136a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
137a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
138a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
139a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
140a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1416bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1426bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1436bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1446bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
145a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
146853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
147a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
148a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1496bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1506bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1516bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1526bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
153bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
1549d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
155a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
156853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1574d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1596bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1604d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1614d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1630654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
1644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1654d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1696bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1714d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1734d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1774a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1780654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
1798abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
183e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
184e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
185e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1870654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
1888abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1898abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1906bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1918abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1928abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1938abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1940654ece95920696c530ce1c0344365eb741f7efePaul Stewart          WPASupplicant::kNetworkBgscanMethodLearn),
1958abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
197e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
198e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1990654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
2008abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2018abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
2028abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
203e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
204e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
2054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
2064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
2078abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
2088abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2093c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
2103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
2113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
2123c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
2143c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
2153c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
217e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
2183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
219bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  explicit WiFiObjectTest(EventDispatcher *dispatcher)
220e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
2216c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(NULL),
222e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
223e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
224626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
225e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2263426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
227626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
228626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
229626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
230626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
2313c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
232dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
233b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
234b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
235f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
236d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart                                        kDeviceName)),
2372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov        dbus_manager_(new NiceMock<MockDBusManager>()),
2380cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
239735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
2403c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
2419413bcc8c3576eeab8f232253264dce4347bbb0cPaul Stewart            new NiceMock<MockSupplicantInterfaceProxy>()),
2422f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal        proxy_factory_(this) {
2435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
2443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
245c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
246d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
247c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
248c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
249c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
250835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)).
251835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart        WillByDefault(InvokeWithoutArgs(
252835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart            this, &WiFiObjectTest::CreateSupplicantNetworkProxy));
253318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
254ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
255735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
256735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
257735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
2582b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2605c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
261bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
2625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
2630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
2645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
2665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
2675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
2685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
2695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2715c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2725c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2733ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2743ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
275d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
276ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2775c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2785c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
2793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
2802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
281b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2825c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2835c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2845c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
2853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
2863c5040174273386868cc8dea8044d22c465885d8Paul Stewart       .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
2879a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
288b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
289b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
290b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
291ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2959a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2965c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
2973ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
2983ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
299d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
300f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
301f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
302549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
303549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
304549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
305549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
306549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
307c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
308c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
309c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
310c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
31117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
31217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart    SetPendingService(NULL);
31317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
314c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
3155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
3165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
3175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
3205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
3215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
3225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
3255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
3265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
3275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
3285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
3315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
3325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
3355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
3365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    std::set<uint16_t> available_frequencies;
3375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
3385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
3395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
3405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
3415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
3425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
3435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
347f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
348f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        NULL);
3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3577347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  void OnTriggerScanResponse(const Nl80211Message &message) {
3585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
3595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
361b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
362b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
363b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    const char *reason) {
364b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
365b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
366b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3679f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
3680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
3690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
3700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
3710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
3723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
3737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
3747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
3753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
3763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
377e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    explicit TestProxyFactory(WiFiObjectTest *test);
3783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
3801830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
381dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
3823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
3833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
385196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart        SupplicantEventDelegateInterface */*delegate*/,
3861830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
3871830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
388dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
3893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
3903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
391b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
392b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
393b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
394b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
395b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
396b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
397835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    MOCK_METHOD2(CreateSupplicantNetworkProxy,
398835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                 SupplicantNetworkProxyInterface *(
399835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const DBus::Path &object_path,
400835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const char *dbus_addr));
401835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
4023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
403b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
404b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
405b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
406b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
407b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
408b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
409b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
410e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    WiFiObjectTest *test_;
4113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
4123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Simulate the course of events when the last enpoint of a service is
4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
416bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
417bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
418bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
419bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
420bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
421bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
422bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        const WiFiEndpointConstRefPtr &endpoint) {
423bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
424bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
425bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
433bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      const WiFiServiceRefPtr &service) {
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
436b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
437b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
438b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *ssid = base::StringPrintf("ssid%d", bss_counter_);
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *path = base::StringPrintf("/interface/bss%d", bss_counter_);
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_);
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart        flimflam::kModeManaged,
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         uint16 frequency,
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      uint16 frequency,
5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
5123c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
5273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    map<string, ::DBus::Variant> params;
5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->ConnectTo(service, params);
5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!network_path.empty()) {
5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillOnce(Return(network_path));
5403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
5663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
5683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
5753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
5763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
5773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5783c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
580bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
5813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
5823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
583a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
5840654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
5853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
5883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
590b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
591b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
592b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
5935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void TriggerFullScan() {
5944823f4f186e31e9acaeaa694e2025440883f20fbWade Guthrie    wifi_->Scan(Device::kFullScan, NULL, __func__);
595c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
5961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
5971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
5981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
599bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
600bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
601bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
6023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
603165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
6043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
6061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
6071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
6092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
6102b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
6111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
612446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
613446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
6147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const string &GetSupplicantBSS() {
6157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
6167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void SetSupplicantBSS(const string &bss) {
6187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
6197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6201aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
6211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
6221aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
623b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
624b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
625b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
627e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
6283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
6293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
6303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
6313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
6338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
6348a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
6353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
6373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
6383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
6393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
6403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
6413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
6423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
6433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
644835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() {
645835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return new NiceMock<MockSupplicantNetworkProxy>();
646835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
6487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
6497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
650835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
651835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
652835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6530427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
6540427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
6550427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
656381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
657381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
658381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
659261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
6603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
6613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
6623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
6633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
664e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
6653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
666c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
66779d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
668c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
669f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
670f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
671f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
672f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
673f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
674f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
675f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
676f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
677f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
6795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
6805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
6825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
6835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
6845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
686dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
6891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
6901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
6927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
6937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
6945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
6955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
6965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
6977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
6987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
6997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
7007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) {
7017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
7027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
703cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
704df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
705cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
706bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
707bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
709e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
710e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
711e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
7122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
7132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
7153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
7172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
7182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7192f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
7202f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
7212f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7222f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
7232f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
7242f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
7262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantAppear(":1.7");
7272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
7282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
7302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantVanish();
7312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
7322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
7342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
7352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
7404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        flimflam::kBgscanMethodProperty,
7414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
7454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
7464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
7474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
7484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7494a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
750bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
751bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
752bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
75310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
754db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
755db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
756db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
757db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
758e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
759e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
760e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
761e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
7621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
7631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
7641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
7671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
7681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
7713c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
7723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
774bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
7751369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
7761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
7771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
7781369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
7793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
7803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
7813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7823c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
783bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanShortInterval(const uint16 &interval, Error *error) {
784bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
785bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
786bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
787bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanSignalThreshold(const int32 &threshold, Error *error) {
788bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
789bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
790bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
791df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
792df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
793df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
794df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
79510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
79610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
79710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
79810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
79985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
80085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
80185aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
80285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
8033239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
8043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
8053239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
806d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
807d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
808d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
809d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
810d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
811d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
812d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
813d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
814d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
8153239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
8163239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
8173239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
8183239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
819b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
820b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
821b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
822b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
8233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
8243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
8253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8263c5040174273386868cc8dea8044d22c465885d8Paul Stewart
827e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
8285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
8295c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
8305c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
8313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
833dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
8343426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
835f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
8362ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
837c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
8383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
8413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
8433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
8443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
8453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
846626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
8473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
8483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
849446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
850446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
8513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
852dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
853b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
854f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
855f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
856735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
857735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
858735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
859735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockDBusManager *dbus_manager_;
8600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
861735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
862bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
8633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
8653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
866835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  NiceMock<TestProxyFactory> proxy_factory_;
8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
8683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
869e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
870e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
871e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
872e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
873446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
874446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
8753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
876e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
877b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
878261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
879261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
880e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
8813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
8823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
8833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
884e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
8853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
8863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
8873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
8903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
8913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
8923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
8943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
8953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
8963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
8973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
8993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
9003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
902e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
9030654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
904e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
9050654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
906b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
9073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
909e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
910b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
911b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
912b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
913b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
914b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
915b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
916b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
917e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
918e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
919e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
920e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
921e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
922e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
9239f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
9249f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
9259f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
9269f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    } else {
9279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
9289f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
9309f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*adaptor_, EmitBoolChanged(_, _)).Times(AnyNumber());
9319f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
9329f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
9339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, true));
9349f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
9359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
9369f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
9379f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9389f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
9399f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
9409f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
9419f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
9429f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
9439f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
9449f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9459f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
9479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
9489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
9499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9509f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9519f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false));
9529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
9539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
9549f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
9559f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
9569f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
9579f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
9589f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
9599f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9609f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
9619f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
9629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
963e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
964e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
965e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
9663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
9673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
9693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
9723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
9733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9752b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
9762b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
9772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9792b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
9802b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9812b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9820654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _));
9832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
9842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9852b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
9872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
9889cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
9899cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
9909cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
9919cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
9929cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
9939cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
9942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
9952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9962b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
9972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
9982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
9992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
10002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
10019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
10029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
10039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
10049cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
10059cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
10062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
10072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
10082b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
10092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
10102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
10112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
10122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
10132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
10142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
10152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
10162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
10172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
10182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
10192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
10202b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
10212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
10222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
10232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
10242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
10252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
10262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1027549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
10283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
10293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
10303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
10313c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
1032549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1033549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1034c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1035549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1036549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1037549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
10383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
10393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
10403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
10413c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
10423c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
10433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1044549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1045549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
1046549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1047549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1048549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
10495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
10505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
10513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
10523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
10563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
10573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1058b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
10593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
10613239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1062b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
10633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
10665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
10675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
10685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
10695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
10705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
10715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
10725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
10735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
10745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
10755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
10765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
10775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
10785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
10795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1080835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
10813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1082835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
10833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
10843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1085835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1086835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1087835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
10880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
10890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
10900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
10910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
10920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
10930427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
10940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1095381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1096381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1097381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
10983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1099381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1100381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1101381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1102381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1103381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
11043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1105381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1106381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1107381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1108381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1109381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1110381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1111381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1112381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1113ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1114ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
1115ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1116ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1117ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1118ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1119381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1120381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
11213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1122381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1123381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1124381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1125381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1126381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1127381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1128381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1129381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1130381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1131381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
11323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1133381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1134381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1135381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1136381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1137381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1138381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1139381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1140381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
11415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
11425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
11433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
11443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
11453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
11463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
11473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
11482b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
11493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
11503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
11513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
11533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
11565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
11575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
11585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
11595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
11605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
11615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
11625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
11635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
11645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
11665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
11673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
11683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
11693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
11703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
11745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
1175c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  StartWiFi();
11763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
11783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1180c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(service);
1181c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // If we're connecting, we ignore scan requests to stay on channel.
11823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1183c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1185c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1186c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
11883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
1189c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
11905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1191c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1192c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1194c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
1195c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(NULL);
1196c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
11973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1198c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
11995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1200c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1201c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1203c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
12043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
1205c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
12065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
1207c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1208c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
1210c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1211c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
12125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
12135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
12185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
12195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // If we're connecting, we ignore scan requests to stay on channel.
12205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
12215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
12235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
12245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
12275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
12285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
12295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
12305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
12315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
12345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
12355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(NULL);
12365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
12375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
12385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1239df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
12405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
12415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
12445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // But otherwise we'll honor the request.
12455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
12465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
1247df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
12485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  TriggerFullScan();
12495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
12525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
12545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
12555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1257ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1258ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
12593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12605c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1261ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1262ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
12632f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1264ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1265ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1266ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
12675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
12685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
12735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
12745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
12760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_TRUE(scan_session_ != NULL);
12770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
12780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
12825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
12835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1285ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1286ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
12873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1288ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1289ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
12902f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1291ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1292ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1293ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
13005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
13015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
13025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
13035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
13055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
13065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
13075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1309ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1310ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
13113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
13133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
13143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
13153ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
13160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1317ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
13182f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1319ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1320ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1321ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
13225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
13235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
13245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
13255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
13285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
13295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
13305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
13310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
13325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1333df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
13345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
13355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
13375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
13383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
13393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
13403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1341e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
13423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1343e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
13443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1345e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
13463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1347e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1348e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
1349e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1350e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1351e41a72d0737488d561a4158019409d5785dad61bThieu Le
1352e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1353e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1354e41a72d0737488d561a4158019409d5785dad61bThieu Le
1355e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1356e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1357e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1358e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1359e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1360e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1361e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1362e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1363e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1364e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1365e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1366e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
13673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
13703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
13723c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
13733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
13743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
13753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
13763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
13773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
13783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
13793c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
13803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
13813c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
13823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
13833c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
13843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
13853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
13863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1388b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1389e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
1390e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1391b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1392e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1393e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
13948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
13958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
13968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
13978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
13983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
13993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
14003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
14013c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
14023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
14033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
14043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
14053c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
14063c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
14078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1409261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1410261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1411261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1412261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
14133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
14143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
14153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
14163c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
14173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
14183c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
14193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
14203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
14213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
14223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1423835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1424835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
14253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
14263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1427835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1428835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
14293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1430835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
14313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14323c5040174273386868cc8dea8044d22c465885d8Paul Stewart
14333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
14340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1435835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1436835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1437835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // with this service.
14383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
14393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1440835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1441835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1442835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
14430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
14440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
14453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
14463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
14473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
14483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
14500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
14513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
14520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
14530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
14540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
14560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
14573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
14583c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
14593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
14603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
14610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
14633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
14643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
14653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
14663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
14673c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService("/new/path", NULL, NULL));
14683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
14710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
14723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
14733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
14753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
14760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
14780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
14790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
14800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
14813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
14822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
14830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
14840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
14863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
14873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
14883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
14893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
14900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
14910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
14920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
14930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
14940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1495835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1496835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1497835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy();
1498835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy(
14990654ece95920696c530ce1c0344365eb741f7efePaul Stewart      kPath, WPASupplicant::kDBusAddr))
1500835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart      .WillOnce(Return(network_proxy));
1501835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1502735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
15040654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
15053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
15080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1509c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
15103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
15113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
15123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
15133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1514c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
15153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1516c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1517c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1518c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1519c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
1520c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, GetCurrentService().get());
1521c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, wifi()->selected_service().get());
1522c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1523c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
15240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
15250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
15263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL));
15273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL));
15280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
15290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
15303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
15310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
15320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
15330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
15340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
15352b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
15362b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
15372b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
153817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
15390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopedMockLog log;
15400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
15410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
15420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
15439f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
154417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
154517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
15469f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
15479f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
154844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
154944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
155017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
155117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
155217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
155317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _))
155417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
155517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
155617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
155717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0);
155817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
15590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
156044f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
156144f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(AnyNumber());
156244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), ResetConnectTimer(_)).Times(AnyNumber());
156344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
15640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
15650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
15660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
156717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
15680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
156917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
15700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
15710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
15720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
157317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
157417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
157517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
15762b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
15772b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
15782b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
15793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
15803c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15812b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
15822b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
158317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
158417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
158617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
158717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
158817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
158917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
159117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
15920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
15930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
15940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
15950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
15973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
15983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
15990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
16000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
16010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
16033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
16053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
16063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
16070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
16080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
16090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
16100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
16113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
16120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
16133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
16140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
16150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16165c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1617c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
16183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
16193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
16203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
16213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
16223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
16253c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
16263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
16273c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
16283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1629c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1630b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1631c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
16325c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
16335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1634549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
16423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
16433c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
16443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1645549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
1646549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1647549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1648549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
1649446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
16503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
16541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
16550654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
16561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
16570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
16581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
16590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
16601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1661446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
16621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
16630654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
16641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
16653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
16673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1669446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
1670446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
1671cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
16725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
1673a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
16740654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
1675ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1676ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1677ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1678ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1679ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1680ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1681ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1682ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1683ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1684ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1685ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
16863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
16873c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
16883c5040174273386868cc8dea8044d22c465885d8Paul Stewart
16895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
16903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
16910654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
16923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
1693ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1694ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
16955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
16965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
16973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
16983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
16993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
17003c5040174273386868cc8dea8044d22c465885d8Paul Stewart
17013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
17023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
17035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
17045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
17053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
17063c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
17073c5040174273386868cc8dea8044d22c465885d8Paul Stewart
17085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
17095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
17105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
17115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
17125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
17135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
17145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
17155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
17165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
17175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
17185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17197347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
17207347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _));
17215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
1722ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
17235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
17247347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _));
17255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
17295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
17305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
17335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
17345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
17365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
17385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
17395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
17405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
17415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
17425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
17435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
17447347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
17457347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _));
17463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
17485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
17495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
17507347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _));
1751ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1752ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1753ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1754fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1755fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
1756fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1757fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
1758fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
17593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
1761fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
1762fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
1763fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
1764fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
1765fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
1766fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
1767fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
17685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
17695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
17705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
17715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
17725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
17749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
17757de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
17765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
17775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
17795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
17805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
17825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
17835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
17855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1786df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1787df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
1788df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1789df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false));
17905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
17915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
17925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
17935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
17945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
17955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
17965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
17975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
17980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
17995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
18025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
18035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
18045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
18055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
180644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
180744f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
180844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
180944f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
18105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
18119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
18125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
18135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
1815b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
18165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
18177de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
18185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
18205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
18215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
18235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
18245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
18255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
18265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
18275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
18285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
18300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
18315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
18335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
18345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
18355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
18360cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
18370cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
18410cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18420cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
18435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
18445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This should call |Scan| which posts |ScanTask|
18465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
18475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
18480cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
18495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
18515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
18525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
18530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
18540cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
18557de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
18560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
18570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
18585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
18595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
18607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
18617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
18627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
18637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
18647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
18657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
18660654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
18670654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
18687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
18697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
18707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
18717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
18727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
18737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1874cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
18757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
18767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
18770654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
18787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
18797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
18807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1881d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
18827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
18837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
18847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
18857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
18867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1887d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1888d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
18897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
18907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1891cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1892bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
1893bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
1894bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
18957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
18960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
18970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
18980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
18997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
19007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
19017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
19023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
19033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
19047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
19057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1906a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
1907a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1908a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1909a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1910a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1911a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
1912a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
1913a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1914a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
1915a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1916a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1917a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1918a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
1919a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
1920a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
1921a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1922a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1923a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1924a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1925a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1926a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1927a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
19280654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
19290654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
1930a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
1931a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1932a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
1933a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1934a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
1935a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1936a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetPendingService(NULL);
1937a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
1938a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1939a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
1940a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // level of supplciant debugging.
1941a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
19420654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
19430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
1944a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
19450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1946a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1947a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
19481590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
19491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
19503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
19513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
19523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL);
19531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
19543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle));
19553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown));
19560654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
19571590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
19581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
19591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
19601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
19611590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
19621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
19633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
19643c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
19653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
19663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
19673c5040174273386868cc8dea8044d22c465885d8Paul Stewart      0, 0, kNetworkModeAdHoc, NULL, &service1));
19683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
19691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1970c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1971c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1972c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1973c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
19743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
19753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
19763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
1977bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
1978a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
19790654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
19803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
19813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
19823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
19831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
19841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1985e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1986e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
19870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
19880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
19890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
19903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
19913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
19923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
19933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
19943c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
19953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
19963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
19984eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
19994eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
20008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
20018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
20023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
20033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
20043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
20058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
20063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
20073c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
20083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
20093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
20108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
20118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
20128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
20138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
20148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
20153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
20163c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
20178a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
20188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
20198a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
20204a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
20210654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
20220654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
20234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
20244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
20254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
20264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
20273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
20283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
20293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
20300654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
20314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
20324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
20334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
20344a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
20354a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
20363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
20373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
20383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
20394a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
20404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
20414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
20424a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
20434a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
20454a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
20464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
20474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
20483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
20493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
20503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
20510654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
20524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
20534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
20544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
20554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
20573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
20594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
20604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
20614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
20620654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
20634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
20644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
20654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
20664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
20674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
20684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
20694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
20704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
20714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
20724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
20730654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
20744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
20753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
20763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
20773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
20784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
20794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
20804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
20810654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
20824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
20834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
20844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
20854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
20864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
20874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
20884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
20895c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
20905c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
20910654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
20925c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
20933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
20945c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
20953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
20965c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
20975c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
20985c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
20990654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
21005c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
21015c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
21024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
21034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2104c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2105c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
21063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
21073c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
2108c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2109c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2110c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2111c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2112c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2113c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
2114c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
2115c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2116c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2117c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2118c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
21193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
21203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
21218f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2122c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
21238f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
21248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
21250654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
21265519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
21273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
21293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
2130ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu  string portal_url;
2131ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhu  EXPECT_CALL(*manager(), GetPortalCheckURL()).WillOnce(ReturnRef(portal_url));
21328f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
21338f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
21345519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
21355519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
21363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
21373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
21383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
21390654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2140c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2141c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2142b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2143b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2144b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2145b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2146b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2147b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2148b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2149b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2150b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2151b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2152b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2153b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2154b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2155b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2156b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2157b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2158b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
21593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
21603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
21613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
21623c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
21633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2164b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2165b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2166b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2167b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2168b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
21695c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
21705c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
21715c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
21725c05b2920be742d518829972127172481722058dmukesh agrawal
21735c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
21745c05b2920be742d518829972127172481722058dmukesh agrawal
21755c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
21765c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
21775c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
21783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
21795c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
21802f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
21815c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
21825c05b2920be742d518829972127172481722058dmukesh agrawal}
21835c05b2920be742d518829972127172481722058dmukesh agrawal
21845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
21855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2186b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2187b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2188b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2189b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2190b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2191b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
21927de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
21930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2194b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2195b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2196b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2197b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2198b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2199b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
22005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
22015a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
22025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
22045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
22055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
22060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2207df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
22085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
22095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
22105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
22125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2214b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2215b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2216b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2217b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2218b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2219b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2220b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2221b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2222b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
22235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2224b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2225b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2226b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2227b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2228b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2229b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2230b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2231b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
22323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
22333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL);
2234b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2235b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2236b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2237b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
22385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2239b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2240b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2241b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2242b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2243b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2244b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2245b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2246b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2247b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2248b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2249bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(1, NULL);
2250b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2251b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2252b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2253b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2254b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2255b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2256b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2257b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2258b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2259b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2260b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2261b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2262b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2263b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2264b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2265b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2266bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(0, NULL);
2267b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2268b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2269b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
22705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
22715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
22725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
22735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetupConnectedService(DBus::Path(), NULL, NULL);
22755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
22765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
22775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
22785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
22795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
22805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
22815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
22825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
22835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
22845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
22855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2286b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2287b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2288b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
22895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
22903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
2291df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
22923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
22933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
22943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
22953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
22963c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
22975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
22980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2299b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2300b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2301b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2302b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2303b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2304b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
23053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
2306b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2307df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
23083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
23093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
23100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2311b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2312b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2313b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
23143c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
23153c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  StartWiFi();
23163c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
23173c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
23183c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
23193c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
23203c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
23213c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
23223c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
23233c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
23243c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
23253c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
23263c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
23273c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
23283c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Called Reassociate()."))).Times(1);
23293c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
23303c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
23313c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnSupplicantVanish();
23323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
23333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
23343c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
23353c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Cannot reassociate."))).Times(1);
23363c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
23373c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
23383c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
2339cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
23403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
2341bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2342bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2343cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2344cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2345bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
23463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
23470654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2348bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2349bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
2350bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
2351bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
23521369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2353bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
23541369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2355cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2356cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2357f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
2358f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
2359f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
2360f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWep);
2361f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
2362f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
2363f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2364f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
2365f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
2366f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
2367f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2368f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2369f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
2370f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
2371f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
2372f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2373f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2374f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2375f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2376f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
2377f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2378f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2379f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
2380f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
2381f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
2382f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
2383f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2384f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2385f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
2386f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
2387f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2388f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2389f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
2390f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
2391f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2392f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _));
2393f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2394f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2395f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2396f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
2397f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
2398f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2399f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
2400f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _));
2401f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2402f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2403f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2404f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
2405f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
2406f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2407f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
2408f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
2409f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart              DisconnectWithFailure(Service::kFailureBadPassphrase, _));
2410f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2411f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
2412f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
24131369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
24143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2415735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2416735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2417735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2418735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2419735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2420bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2421bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2422bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2423bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2424bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
24251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2426bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
24271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2428bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2429bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2430bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2431bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2432bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2433bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2434bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2435bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
2436bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
24371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
24381369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
24391369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2440cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2441cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
24420654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2443cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2444bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2445f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
244656e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
244756e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetState(_)).Times(0);
2448735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2449cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
24501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
24511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(flimflam::kErrorBadPassphrase)));
24520654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
24531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
24541369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
24551369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
24561369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
24571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
24581369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2459735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2460735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
24611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
24621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(0);
2463735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2464735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2465735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2466735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2467735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2468bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2469735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
24701369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
24711369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(shill::kErrorEapAuthenticationFailed)));
2472735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
24730654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2474cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2475cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2476e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2477e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
24781aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2479e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
24801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2481e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2482e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2483e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2484e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2485e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2486e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2487e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
24881aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2489e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2490e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2491e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2492e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2493e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
2494e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
2495e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
2496e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
2497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
2498e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
2499e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
2500e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
2501e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2502e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
2503e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2504e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
2505e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
2506e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2507e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2508e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
2509e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2510e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
2511e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2512e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2513e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2514e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
2515e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
2516e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
2517e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
2518e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2519e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
25201aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
2521e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
2522e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
2523e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
2524e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2525e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2526e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2527e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
2528e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2529e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2530e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2531e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
2532e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2533e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2534e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2535e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
2536e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2537e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2538e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2539e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
25401aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
25411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
25421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
25451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
25461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
25471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
25481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
25491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
25501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
25511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
25521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
25531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
25541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
25551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
25561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
25571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
25581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
25591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
25601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
25611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
25621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
25631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
25641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
25651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
25661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
25671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
25681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
25697cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
25707cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
25717cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
25727cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
25737cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
25747cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
25757cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
25767cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
25777cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
25787cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
25797cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
25807cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _)).Times(0);
25817cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
25827cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
25837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
25847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
25857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
25867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(NULL);
25877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
25887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
25897cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // current_service_ is not connnected.
25907cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
25917cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
25927cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
25937cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
25947cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
25957cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
25967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
25977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
25987cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
25997cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
26007cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
26017cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
26027cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
26037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
26047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
26057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
26067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
26077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _));
26087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
26097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
26107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
26117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
26127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
26137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
26147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
26157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
26167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
26177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
26187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
26197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
26207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
26217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
26227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
26237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
26247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
26257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
26267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
26277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
26287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const int16_t kSignalValue = -20;
26297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
26307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
26317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
26327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
26337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
26347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
26357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
26367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
26377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
26387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
2639bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
2640bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2641bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2642bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2643bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
2644bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2645bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
2646bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2647bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2648bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2649bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
2650bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2651bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2652bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2653bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2654bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
26550654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2656bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2657bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
2658bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2659bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2660bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2661bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2662bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
26630654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
2664bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
2665bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2666bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2667db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
2668db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2669db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
2670db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
2671db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2672735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
2673735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
2674735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
2675735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2676db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2677db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2678db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2679735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2680db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2681735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
2682db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
2683735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2684735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
2685735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
2686db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2687735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
2688735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
2689735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
2690735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
2691735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
2692bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
2693bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2694c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2695c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
2696c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
2697c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
2698c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
2699c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
2700c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2701c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
2702c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
2703c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
2704c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
2705c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
270660ceaf336297ce536201a82e350c697f1a5b546dDarin PetkovTEST_F(WiFiMainTest, VerifyPaths) {
2707196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart  string path(WPASupplicant::kSupplicantConfPath);
270860ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  TrimString(path, FilePath::kSeparators, &path);
270960ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
271060ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov}
271160ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov
27126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
27136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
27146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
27156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
27166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
27176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  uint16 frequency;
27186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
27196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
27206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
27216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
27226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
27236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
27246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
27256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
27266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
27276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
27286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
27296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
27306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
27316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
27326d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
27336d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
27346d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
27356d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
27366d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
27376d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
27386d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
27396d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
27406d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
27416d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
27426d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
27436d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
27446d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
27456d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
27466d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
27476d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
27487347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
27497347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
27506d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
27515581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
27525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
27535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
27545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
27555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
27565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
27575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
27585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
27595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
27605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
27615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
27625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
27630654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
27645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
27655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
27665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
27675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
27685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
27695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
27705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
27710654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
27720654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
27730654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
27740654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
27750654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
27760654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
27770654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
27780654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
27795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
27805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
27815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
27825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
27835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
27845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
27855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
27865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
27875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
27885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
27895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
27905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
27915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
27925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
27930654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
27940654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
27955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
27965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
27975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
27985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
27995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
28005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
28015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
28020654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
28030654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
28045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
28055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
28065581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
28075581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
28085581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
28095581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
28105581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
28110654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
28120654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
28135581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
28145581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
28155581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
28165581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
28175581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
28185581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
28195581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
28205581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
28215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
28225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
28235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
28245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
282550cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
282650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
282750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
282850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
282950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
2830bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
2831bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
2832bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
2833bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
2834bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2835bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2836bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const uint16 kKnownScanInterval = 4;
2837bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
2838bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
2839bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2840bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
2841bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
2842bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2843bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2844bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
2845bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
2846bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2847bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2848bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const int32 kKnownSignalThreshold = 4;
2849bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
2850bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
2851bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2852bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
2853bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
2854bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2855bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2856bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
2857bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
2858bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
2859bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
2860bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
2861bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
2862bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
2863bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
2864bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
28650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
28660cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28670cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
28680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopedMockLog log;
28690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
28700cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
28710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
28730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
28749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
28750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
28760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
28770cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*adaptor_, EmitBoolChanged(flimflam::kScanningProperty, false));
28787de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
28790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
28800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
28810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
28830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
28840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
28850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28860cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
28870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopedMockLog log;
28880cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
28890cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
28900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28919f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
28920cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
28930cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
28949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
28959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
28969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
28970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
28980cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
28990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
29000cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
29010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
29020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
29030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
29040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
29050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
29060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
29070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
29080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
29090cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
29109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
29110cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
29120cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
29130cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
29149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
29150cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
29160cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
29179f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
29189f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
29190cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
29200cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
29210cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
29220cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
29230cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
292444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
29250cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
29260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
29270cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
29280cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
29290cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
29300cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
29310cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
2932df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
29339f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
2934df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
29359f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
29369f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
2937df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2938df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
29399f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
2940df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2941df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
2942df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*service,
2943df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
2944df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2945df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
2946df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
2947df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
2948df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2949df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), ResetConnectTimer(_)).Times(2);
2950df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
2951df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
2952df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2953df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2954df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
2955df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2956b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
2957b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
2958b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
2959df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
2960b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
2961b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
2962df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2963df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
2964df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
2965df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2966df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
2967b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
2968b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
2969b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
2970b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
2971df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
2972df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
2973df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
2974df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
2975df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2976df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
2977df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
2978df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
2979df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
2980df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
2981df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2982df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
2983df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Test for SetPendingService(NULL), condition a)
2984df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
29859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
2986df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2987df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
2988df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
2989df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), NULL, NULL));
2990df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
2991df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
2992df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
29939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
2994df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
2995df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
2996df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
2997df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2998df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
2999df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
3000df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
3001df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), NULL, NULL));
3002df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3003df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3004df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
3005df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(NULL, GetCurrentService().get());
3006df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3007df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3008df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3009df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
30109f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3011df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3012df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
3013df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
3014df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
3015df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
3016df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
3017df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3018df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3019df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3020df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
3021df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
3022df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3023df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
3024df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3025df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3026df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
3027df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Test for SetPendingService(NULL), condition d) Disconnect while scanning.
3028df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
30299f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3030df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3031df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
3032df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
3033df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
3034df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
3035df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3036df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3037df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
3038df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3039df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3040df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3041df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3042df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3043df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3044df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3045df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
3046df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  NiceScopedMockLog log;
3047df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3048df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
3049df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
3050df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
3051df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
3052df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), ResetConnectTimer(_));
3053df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanIdle, WiFi::kScanMethodNone, __func__);
3054df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3055df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
3056df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3057df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
3058df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
3059df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3060df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3061df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3062df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
3063df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3064df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
3065df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
3066df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
3067df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3068df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
3069df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
3070df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
3071df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3072df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3073df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3074df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3075df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
30763bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
30773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
30783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
30793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
30803bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
30813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
30823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  TriggerFullScan();
30833bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
30843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
30853bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
30863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
30877de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
30883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
30893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
30903bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
30913bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
3092853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
3093