wifi_unittest.cc revision 316acef85ecfc128bf06cc2d2699f21880aa5a7e
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>
19a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_number_conversions.h>
20a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h>
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
22a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/stringprintf.h>
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
2726b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
298ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
31b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
32853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie#include "shill/mock_adaptors.h"
34084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan#include "shill/mock_dbus_service_proxy.h"
35853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
36c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
37f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
3911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart#include "shill/mock_eap_credentials.h"
40e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
41687350531096cacc379c209e39e63e5316eee5c0Paul Stewart#include "shill/mock_ipconfig.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"
48af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/mock_proxy_factory.h"
495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/mock_scan_session.h"
51a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
52b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
53735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart#include "shill/mock_supplicant_eap_state_handler.h"
543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
55835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
575c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
583c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/netlink_message_matchers.h"
61dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/nl80211_message.h"
63853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie#include "shill/scan_session.h"
6585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
66af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan#include "shill/testing.h"
673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
69ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
70853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
710e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
72a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chanusing base::StringPrintf;
73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
783c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
80a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
81cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrieusing ::testing::HasSubstr;
833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
84b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
85549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MakeMatcher;
875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::Matcher;
885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatcherInterface;
895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieusing ::testing::MatchResultListener;
907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
91dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
92d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
9311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewartusing ::testing::Ref;
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
95af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chanusing ::testing::ReturnNew;
96ba99b598d3f399a41e57f49dccac5f988e653126Prathmesh Prabhuusing ::testing::ReturnRef;
97ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
98a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
99a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
100a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
1023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
1038ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
104853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
105853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
106853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrienamespace {
1085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kNl80211FamilyId = 0x13;
1105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency1 = 5600;
1115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency2 = 5560;
1125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrieconst uint16_t kRandomScanFrequency3 = 2422;
113c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewartconst int kInterfaceIndex = 1234;
1145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}  // namespace
1165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
1193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
1203426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
121c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                         NULL, NULL, manager(), "wifi", "", kInterfaceIndex)) {
122853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
1233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
124853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
125853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
1268abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
127853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
128853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
130f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_TRUE(device_->store().Contains(kNameProperty));
131de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
132853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
133853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1346bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
135a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
136a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1376bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
138de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
139f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanSignalThresholdProperty,
140a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
141a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
142a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
143a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
144a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1456bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
146f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                         kScanIntervalProperty,
1476bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
149a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
150853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
151a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
152a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1536bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
154f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan                                          kScanningProperty,
1556bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1566bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
157bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    ASSERT_TRUE(error.is_set());  // name() may be invalid otherwise
1589d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
159a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
160853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1614d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1636bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
165f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
1664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1670654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
1684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1694d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1714d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1724d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1736bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1744d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
175f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
1764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1774d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1784d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1794d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1804d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1814a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1820654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
1838abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
187e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
188e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
189f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
1904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1910654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
1928abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1938abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1946bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1958abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
196f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty,
197f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      DBusAdaptor::StringToVariant(WPASupplicant::kNetworkBgscanMethodLearn),
1988abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1990654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
200e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
201f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
2020654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
2038abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2048abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
205f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      device_->mutable_store(), kBgscanMethodProperty, &error));
206e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
207f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      kBgscanMethodProperty, &method, &unused_error));
2084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
2094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
2108abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
2118abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
2123c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
2143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
2153c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
2163c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
2173c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
2183c5040174273386868cc8dea8044d22c465885d8Paul Stewart
2195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
220e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
2213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
222bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  explicit WiFiObjectTest(EventDispatcher *dispatcher)
223e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
2246c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(NULL),
225e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
226e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
227626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
228e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2293426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
230626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
231626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
232626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
233c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                       kInterfaceIndex)),
2343c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
235084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_service_proxy_(new MockDBusServiceProxy()),
236dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
237af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        supplicant_bss_proxy_(new NiceMock<MockSupplicantBSSProxy>()),
238af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        dhcp_config_(new MockDHCPConfig(&control_interface_, kDeviceName)),
239084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan        dbus_manager_(new DBusManager()),
2400cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie        adaptor_(new DeviceMockAdaptor()),
241735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart        eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
2423c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
243af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan            new NiceMock<MockSupplicantInterfaceProxy>()) {
2445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
2453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
246c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
247af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _, _))
248af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(Return(dhcp_config_));
249af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(*dhcp_config_.get(), RequestIP()).WillByDefault(Return(true));
250af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan
251af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateDBusServiceProxy())
252af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&dbus_service_proxy_));
253af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantProcessProxy(_, _))
254af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_process_proxy_));
255af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantInterfaceProxy(_, _, _))
256af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_interface_proxy_));
257af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantBSSProxy(_, _, _))
258af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnAndReleasePointee(&supplicant_bss_proxy_));
259af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _))
260af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan        .WillByDefault(ReturnNew<NiceMock<MockSupplicantNetworkProxy>>());
261318445d33275a29a5d5f50a507b138a28b106d1bWade Guthrie    Nl80211Message::SetMessageType(kNl80211FamilyId);
262ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
263735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    // Transfers ownership.
264735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    manager_.dbus_manager_.reset(dbus_manager_);
265735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart    wifi_->eap_state_handler_.reset(eap_state_handler_);
2662b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2685c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
269bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    wifi_->netlink_manager_ = &netlink_manager_;
2705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = true;
2710cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    wifi_->adaptor_.reset(adaptor_);  // Transfers ownership.
2725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // The following is only useful when a real |ScanSession| is used; it is
2745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // ignored by |MockScanSession|.
2755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency1);
2765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency2);
2775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->all_scan_frequencies_.insert(kRandomScanFrequency3);
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2795c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2805c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2813ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2823ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
283d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
284084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->proxy_factory_ = &proxy_factory_;
285ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2865c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2875c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
2883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
2892b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
290b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2915c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2925c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2935c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
2943c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
2953c5040174273386868cc8dea8044d22c465885d8Paul Stewart       .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
2969a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
297b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
298b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
299b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
300ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
3013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
3033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
3049a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
3055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
306084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Stop();
307084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->proxy_factory_ = NULL;
3083ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
3093ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
310d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
311f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
312f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
313549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
314549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
315549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
316549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
317549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
318c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
319c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
320c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
321c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
32217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  void ResetPendingService() {
32317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart    SetPendingService(NULL);
32417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  }
325c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
3265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  size_t GetScanFrequencyCount() const {
3275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return wifi_->all_scan_frequencies_.size();
3285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void SetScanSize(int min, int max) {
3315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->min_frequencies_to_scan_ = min;
3325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->max_frequencies_to_scan_ = max;
3335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // This clears WiFi::scan_session_, thereby allowing WiFi::Scan to create a
3365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // real scan session.
3375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ClearScanSession() {
3385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
3395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  bool IsScanSessionNull() {
3425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    return !wifi_->scan_session_;
3435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void InstallMockScanSession() {
3465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    WiFiProvider::FrequencyCountList previous_frequencies;
3475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    std::set<uint16_t> available_frequencies;
3485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::FractionList fractions;
3495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    ScanSession::OnScanFailed null_callback;
3505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    scan_session_ = new MockScanSession(&netlink_manager_,
3515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        event_dispatcher_,
3525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        previous_frequencies,
3535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        available_frequencies,
3545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        fractions,
3565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
3575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie                                        0,
358f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        null_callback,
359f22681f67771e4f3f79984ba77eb94d1f6294405Wade Guthrie                                        NULL);
3605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset(scan_session_);
3615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Or DisableProgressiveScan()...
3645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void EnableFullScan() {
3655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->progressive_scan_enabled_ = false;
3665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
3687347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  void OnTriggerScanResponse(const Nl80211Message &message) {
3695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_->OnTriggerScanResponse(message);
3705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
3715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
372b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  void SetScanState(WiFi::ScanState new_state,
373b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    WiFi::ScanMethod new_method,
374b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie                    const char *reason) {
375b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie    wifi_->SetScanState(new_state, new_method, reason);
376b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  }
377b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void VerifyScanState(WiFi::ScanState state, WiFi::ScanMethod method) const {
3790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(state, wifi_->scan_state_);
3800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie    EXPECT_EQ(method, wifi_->scan_method_);
3810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  }
3820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
383227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  void SetRoamThresholdMember(uint16 threshold) {
384227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    wifi_->roam_threshold_db_ = threshold;
385227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
386227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
387227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  bool SetRoamThreshold(uint16 threshold) {
388227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->SetRoamThreshold(threshold, nullptr);
389227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
390227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
391227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  uint16 GetRoamThreshold() const {
392227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie    return wifi_->GetRoamThreshold(nullptr);
393227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  }
394227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
3953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
3967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
3977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
3982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Simulate the course of events when the last endpoint of a service is
3993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
4003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
401bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie   public:
402bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
403bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        : wifi_(wifi), service_(service) {}
404bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    virtual ~EndpointRemovalHandler() {}
405bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie
406bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    WiFiServiceRefPtr OnEndpointRemoved(
407bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie        const WiFiEndpointConstRefPtr &endpoint) {
408bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      wifi_->DisassociateFromService(service_);
409bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      return service_;
410bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie    }
4113c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4123c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
4163c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
418bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie      const WiFiServiceRefPtr &service) {
4193c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
4203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
421b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
422b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
423b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
4243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
4253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
435a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan      *ssid = StringPrintf("ssid%d", bss_counter_);
4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
437a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *path = StringPrintf("/interface/bss%d", bss_counter_);
438a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    *bssid = StringPrintf("00:00:00:00:00:%02x", bss_counter_);
4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
461f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kModeManaged,
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         uint16 frequency,
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
4933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
4943c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
4953c5040174273386868cc8dea8044d22c465885d8Paul Stewart      uint16 frequency,
4963c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
4973c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
4983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
4993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
5003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
5013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
5023c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
5033c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
5043c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
5053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
5063c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5073c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5093c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
5103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
512a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    wifi_->ConnectTo(service);
5133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
5153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
5163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
5183c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
5223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5233c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
525a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    if (!network_path.empty()) {
526a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
527a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
528a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart          .WillOnce(Return(network_path));
529a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
530a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart    }
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5383c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5403c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
5433c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
5453c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
5463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
5473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
5483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
5493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
5503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
5513c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
5523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
5533c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
5543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
5563c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
5573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
5583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
5593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
5603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
5613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5623c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
564bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart    EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
56575a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _))
56675a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart        .Times(AnyNumber());
5673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
568a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal    EXPECT_CALL(wifi_provider_, IncrementConnectCount(_));
5690654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
5703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
5713c5040174273386868cc8dea8044d22c465885d8Paul Stewart
5723c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
5733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
5741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
575b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
576b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
577b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
5782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void TriggerScan(WiFi::ScanMethod method) {
5792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (method == WiFi::kScanMethodFull) {
5802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      wifi_->Scan(Device::kFullScan, NULL, __func__);
5812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
5822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      wifi_->Scan(Device::kProgressiveScan, NULL, __func__);
5832ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    }
584c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
5851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
5861590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
5871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
588bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
589bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
590bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
5913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
592165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
5933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5941590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
5951590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
5961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5972b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
5982b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
5992b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
6001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
601446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
602446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
6037cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  const string &GetSupplicantBSS() {
6047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    return wifi_->supplicant_bss_;
6057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void SetSupplicantBSS(const string &bss) {
6077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->supplicant_bss_ = bss;
6087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
6101aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
6111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
612b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
613b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
614b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
6153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
616e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
6183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
6193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
6203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
6228a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
6238a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
6243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
6263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
6273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
6283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
6293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
6303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
6313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
6323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
6337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
6347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
6357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
636835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
637835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
638835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
6390427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
6400427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
6410427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
642381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
643381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
644381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
645261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
6463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
6483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
6493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
650e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
652c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
653c5099532b82fe201fe2510c43b529944a0930d2ePaul Stewart    wifi_->OnIPConfigUpdated(dhcp_config_);
654c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
655f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportIPConfigFailure() {
656f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnIPConfigFailure();
657f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
658f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  void ReportConnected() {
659f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart    wifi_->OnConnected();
660f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  }
661f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
662f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
663f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
6643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
6655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Eliminate |scan_session| so |ScanDoneTask| doesn't launch another scan.
6665a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->scan_session_.reset();
6675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    wifi_->ScanDoneTask();
6685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    // Make a new |scan_session| so that future scanning is done with the mock.
6695a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie    InstallMockScanSession();
6705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  }
6715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  void ReportScanDoneKeepScanSession() {
672dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
6733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
6741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
6751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
6761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
6777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
6787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
6797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
6805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
6815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
6825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
6837cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void RequestStationInfo() {
6847cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->RequestStationInfo();
6857cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
6867cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  void ReportReceivedStationInfo(const Nl80211Message &nl80211_message) {
6877cd4572126da015b195caf82449c14b4065c4c59Paul Stewart    wifi_->OnReceivedStationInfo(nl80211_message);
6887cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  }
689baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore GetLinkStatistics() {
690baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart    return wifi_->GetLinkStatistics(NULL);
691baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  }
692cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
693df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->SetPendingService(service);
694cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
69511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  void SetServiceNetworkRpcId(
69611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      const WiFiServiceRefPtr &service, const string &rpcid) {
69711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart    wifi_->rpcid_by_service_[service.get()] = rpcid;
69811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  }
699bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetScanInterval(uint16_t interval_seconds, Error *error) {
700bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetScanInterval(interval_seconds, error);
701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
702e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
703e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
704e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
7052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
706a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
707a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
708a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeConfig));
709a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
710a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
711a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeScan));
712a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
713a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
714a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeRegulatory));
715a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SubscribeToEvents(
716a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Nl80211Message::kMessageTypeString,
717a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        NetlinkManager::kEventTypeMlme));
718a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(netlink_manager_, SendNl80211Message(
719a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_WIPHY), _, _));
720a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
721084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    dbus_manager_->Start();
7222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
7243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
7262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
7272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7282f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
7292f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
7302f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7312f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
7322f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
7332f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
7342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
735084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantAppear(WPASupplicant::kDBusAddr, ":1.7");
7362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
7372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
739084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan    wifi_->OnSupplicantVanish(WPASupplicant::kDBusAddr);
7402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
7412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
7422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
7432b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
7442b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
745687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  bool GetIsRoamingInProgress() {
746687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->is_roaming_in_progress_;
747687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
748687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  void SetIPConfig(const IPConfigRefPtr &ipconfig) {
749687350531096cacc379c209e39e63e5316eee5c0Paul Stewart    return wifi_->set_ipconfig(ipconfig);
750687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  }
7514a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
7524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
7534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
7544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
755f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan        kBgscanMethodProperty,
7564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
7574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
7584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
7604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
7614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
7624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
7634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
7644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
765bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
766bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
767bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
76810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
769db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
770db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
771db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
772db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
773e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
774e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
775e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
776e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
7771aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
7781aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
7791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
7821aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
7831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
7841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
7853c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
7863c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
7873c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
789bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  bool SuspectCredentials(const WiFiServiceRefPtr &service,
7901369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
7911369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
7921369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
7931369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
7943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
7953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
7963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
7973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
798bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanShortInterval(const uint16 &interval, Error *error) {
799bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanShortInterval(interval, error);
800bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
801bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
802bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  bool SetBgscanSignalThreshold(const int32 &threshold, Error *error) {
803bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    return wifi_->SetBgscanSignalThreshold(threshold, error);
804bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
805bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
806df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSDiscover(const string &peer) {
807df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSDiscover(peer);
808df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
809df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
810df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSSetup(const string &peer) {
811df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSSetup(peer);
812df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
813df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
814df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  string TDLSStatus(const string &peer) {
815df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSStatus(peer);
816df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
817df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
818df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  bool TDLSTeardown(const string &peer) {
819df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart    return wifi_->TDLSTeardown(peer);
820df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  }
821df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
822c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  string PerformTDLSOperation(const string &operation,
823c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              const string &peer,
824c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart                              Error *error) {
825c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    return wifi_->PerformTDLSOperation(operation, peer, error);
826c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
827c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
828df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  void TimeoutPendingConnection() {
829df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie    wifi_->PendingTimeoutHandler();
830df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  }
831df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
83210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
83310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
83410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
83510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
83685aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
83785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
83885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
83985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
8403239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
8413239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
8423239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
843d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
844d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
845d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
846d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
847d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
848d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
849d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
850d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
851d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
8523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
8533239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
8543239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
8553239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
856af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory *proxy_factory() {
857b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
858b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
859b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
8603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
8613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
8623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
8633c5040174273386868cc8dea8044d22c465885d8Paul Stewart
864e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
8655a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  MockScanSession *scan_session_;  // Owned by |wifi_|.
8665c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
8675c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
8683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
870dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
8713426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
872f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
8732ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
874c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
8753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
8773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
8783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
8803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
8813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
8823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
883626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
8843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
8853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
886446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
887446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
888227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16 kRoamThreshold;
8893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
890084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  scoped_ptr<MockDBusServiceProxy> dbus_service_proxy_;
891dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
892b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
893f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
894f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
895084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  DBusManager *dbus_manager_;
896735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart
897735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // These pointers track mock objects owned by the WiFi device instance
898735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // and manager so we can perform expectations against them.
8990cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  DeviceMockAdaptor *adaptor_;
900735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  MockSupplicantEAPStateHandler *eap_state_handler_;
901bb9fca2e550f92d694867f0bcf0efe9426dfc2bbWade Guthrie  MockNetlinkManager netlink_manager_;
9023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
905af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  MockProxyFactory proxy_factory_;
9063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
9073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
908e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
909e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
910e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
911e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
912446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
913446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
914227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrieconst uint16 WiFiObjectTest::kRoamThreshold = 32;  // Arbitrary value.
9153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
916e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
917b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
918261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
919261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
920e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
9213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
9223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
9233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
924e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
9253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
9263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
9273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
9293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
9303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
9313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
9333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
9343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
935a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan    base::RemoveChars(bssid, ":", &bssid_nosep);
9363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
9373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
9393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
9403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9410654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
942e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
9430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
944e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
9450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
946b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
9473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
949e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
950e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
951e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
952e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
953e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
954e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
955a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // A progressive scan requests one or more scans, each of which asks about a
956a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // different batch of frequencies/channels.
957a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  enum WhichBatchOfProgressiveScan {
958a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kFirstProgressiveScanBatch,
9592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    kOnlyFullScanBatch,
960a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    kNotFirstProgressiveScanBatch
961a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  };
9629f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  void StartScan(WiFi::ScanMethod method) {
9639f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (method == WiFi::kScanMethodFull) {
9649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      EnableFullScan();
9659f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
967f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
968a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie        Times(AnyNumber());
9692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // Using kFirstProgressiveScanBatch regardless of the method since
9702ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    // kFOnlyFullScanBatch does exactly the same thing.
9712ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    ExpectScanStart(method, false);
9729f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    StartWiFi();
9739f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
9749f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanScanning, method);
9759f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
9769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9779f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr AttemptConnection(WiFi::ScanMethod method,
9789f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          WiFiEndpointRefPtr *endpoint,
9799f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                          ::DBus::Path *bss_path) {
9809f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    WiFiEndpointRefPtr dummy_endpoint;
9819f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!endpoint) {
9829f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      endpoint = &dummy_endpoint;  // If caller doesn't care about endpoint.
9839f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9849f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9859f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ::DBus::Path dummy_bss_path;
9869f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    if (!bss_path) {
9879f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      bss_path = &dummy_bss_path;  // If caller doesn't care about bss_path.
9889f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    }
9899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
990a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanStop();
991a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectConnecting();
9929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    MockWiFiServiceRefPtr service =
9939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie        SetupConnectingService(DBus::Path(), endpoint, bss_path);
9949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    ReportScanDoneKeepScanSession();
9959f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    dispatcher_.DispatchPendingEvents();
9969f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    VerifyScanState(WiFi::kScanConnecting, method);
9979f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
9989f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie    return service;
9999f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  }
10009f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie
10012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  void ExpectScanStart(WiFi::ScanMethod method, bool is_continued) {
1002a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    if (method == WiFi::kScanMethodProgressive) {
10032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      ASSERT_FALSE(IsScanSessionNull());
1004a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, HasMoreFrequencies());
1005a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*scan_session_, InitiateScan());
10062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    } else {
10072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1008a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
10092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie    if (!is_continued) {
1010f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan      EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty,
1011a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie                                             true));
1012a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
1013a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    }
1014a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1015a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1016a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  // Scanning can stop for any reason (including transitioning to connecting).
1017a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanStop() {
1018f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan    EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
1019a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1020a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1021a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnecting() {
1022a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1023a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
1024a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1025a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1026a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectConnected() {
1027a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
1028a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1029a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1030a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1031a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectFoundNothing() {
1032a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
1033a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_));
1034a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    ExpectScanIdle();
1035a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1036a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1037a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  void ExpectScanIdle() {
1038a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetScanTimer(_));
1039a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie    EXPECT_CALL(*metrics(), ResetConnectTimer(_)).RetiresOnSaturation();
1040a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  }
1041a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
1042e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
1043e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1044e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
10453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
10463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
10473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
10483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
10513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
10523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10542b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
10552b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
10562b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
10572b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1058227c774828f02cb2c60fc3588263f67e1a768eb9Wade GuthrieTEST_F(WiFiMainTest, RoamThresholdProperty) {
1059227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold16 = 16;
1060227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  static const uint16_t kRoamThreshold32 = 32;
1061227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1062227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  StartWiFi(false);  // No supplicant present.
1063227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  OnSupplicantAppear();
1064227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1065227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1066227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold16));
1067227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold16));
1068227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold16);
1069227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
1070227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  // Try a different number
1071227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1072227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie              SetRoamThreshold(kRoamThreshold32));
1073227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_TRUE(SetRoamThreshold(kRoamThreshold32));
1074227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_EQ(GetRoamThreshold(), kRoamThreshold32);
1075227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie}
1076227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
10772b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
10782b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
10792b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1080084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan  EXPECT_CALL(*dbus_service_proxy_.get(),
1081084facaf2ca23f176d080b2f70847edbb1d59aaeBen Chan              GetNameOwner(WPASupplicant::kDBusAddr, _, _, _));
10822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
10832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
10842b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1085227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  SetRoamThresholdMember(kRoamThreshold);
1086227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
1087227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(0));
1088227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetFastReauth(false));
1089227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetRoamThreshold(kRoamThreshold));
1090227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetScanInterval(_));
1091227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SetDisableHighBitrates(true));
1092227c774828f02cb2c60fc3588263f67e1a768eb9Wade Guthrie
10932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
10942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
10959cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
10969cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
10979cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
10989cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
10999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
11009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
11012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11032b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
11042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
11052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
11072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
11089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
11099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
11109cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
11119cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
11129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
11132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11152b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
11162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
11172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
11192b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
11202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
11212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
11232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
11242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
11252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
11272b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
11282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
11292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
11302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
11312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
11322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
11332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
1134549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
11353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
11363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
11373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
11383c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
1139549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
1140549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1141c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1142549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
1143549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
1144549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
11453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
11463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
11473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
11483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
11493c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
11503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1151549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
1152549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
1153549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1154549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1155549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
11565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart_FullScan) {
11575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
11583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
11593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
11603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
11613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
11623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
11633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
11643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1165b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
11663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
11673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
11683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1169b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
11703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
11725a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, CleanStart) {
11735a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
11745a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
11755a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
11765a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
11775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
11785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
11795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
11805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
11815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
11825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
11835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
11845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());
11855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
11865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
1187835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
11883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
1189835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
11903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
11913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1192835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
1193835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1194835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
11950427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
11960427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
11970427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
11980427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
11990427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
12000427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
12010427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
1202381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
1203381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
1204381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
12053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
1206381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1207381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1208381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1209381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
1210381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
12113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1212381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1213381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1214381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
1215381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
1216381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1217381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
1218381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1219381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1220ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
1221316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  StartWiFi();
1222316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1223316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // With no selected service.
1224316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
1225316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true, false))
1226316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1227316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1228316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1229316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
1230316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  InitiateConnect(service);
1231316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1232316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that does not have a static IP address.
1233316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(false));
1234316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_TRUE(wifi()->ShouldUseArpGateway());
123575a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true, false))
1236ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
1237ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1238316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  Mock::VerifyAndClearExpectations(service);
1239316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart
1240316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  // Selected service that has a static IP address.
1241316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(*service, HasStaticIPAddress()).WillRepeatedly(Return(true));
1242316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_FALSE(wifi()->ShouldUseArpGateway());
1243316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, false, false))
1244316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart      .WillOnce(Return(dhcp_config_));
1245316acef85ecfc128bf06cc2d2699f21880aa5a7ePaul Stewart  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
1246ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
1247ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
1248381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
1249381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
12503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1251381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1252381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1253381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
1254381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
1255381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1256381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1257381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1258381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
1259381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
1260381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
12613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
1262381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
1263381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
1264381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
1265381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
1266381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
1267381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
1268381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
1269381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
12705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart_FullScan) {
12715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
12723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
12733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
12743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
12753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
12763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
12772b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
12783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
12803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
12813239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
12823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
12833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
12845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, Restart) {
12855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
12865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .Times(AnyNumber())
12875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Throw(
12885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie          DBus::Error(
12895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceExists",
12905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
12915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
12925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
12935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
12945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
12955a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
12963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
12973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
12983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
12993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
13003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
13013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
13025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting_FullScan) {
13032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
13042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1309f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
13102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
13112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodFull);
13122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
1314c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
13152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1316c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1317c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
13192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13202ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
13212ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
13222ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
13232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
13242ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13252ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
13262ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
13272ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1328c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1329c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
13312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1332c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
13332ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13342ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1335c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(NULL);
1336c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
13373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
1338c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
13392ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1340c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1341c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
13432ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
1344c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
13452ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).Times(AtLeast(2)).
13462ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      WillRepeatedly(Return(false));
13472ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodFull, false);
13482ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
1349c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
1350c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
13522ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13532ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Silence messages from the destructor.
13542ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13552ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
1356c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
1357c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
13585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, NoScansWhileConnecting) {
13592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Setup 'connecting' state.
13602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
13612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectConnecting();
1363f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
13642ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InitiateConnect(service);
13652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
13662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13672ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // If we're connecting, we ignore scan requests and stay on channel.
13685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
13692ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
13705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
13722ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
13732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13742ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Terminate the scan.
13752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectFoundNothing();
13762ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TimeoutPendingConnection();
13772ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
13782ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13792ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Start a fresh scan.
13802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
13812ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
13822ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
13835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
13852ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
13862ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
13875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Similarly, ignore scans when our connected service is reconnecting.
13882ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
13892ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
13905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(NULL);
13915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetCurrentService(service);
13925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
13932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  InstallMockScanSession();
13942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
13952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
13965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
13975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
13982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
13992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
14002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Unlike Full scan, Progressive scan will reject attempts to scan while
14012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // we're connected.
14025a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
14032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
14055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(service);
14072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  Mock::VerifyAndClearExpectations(scan_session_);
14085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
14095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
14105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle_FullScan) {
14115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
14123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1413ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1414ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
14153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14165c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1417ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1418ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
14192f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1420ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1421ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1422ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
14235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
14245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
14255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
14265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
14295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
14305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
14320cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_TRUE(scan_session_ != NULL);
14330cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  InstallMockScanSession();
14340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
14355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
14375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
14385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan_FullScan) {
14395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
14403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1441ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1442ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
14433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1444ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1445ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14462f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1447ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1448ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1449ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
14505a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
14515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
14525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
14535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ASSERT_TRUE(wifi()->IsIdle());
14565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14575a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
14585a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnBeforeSuspend();
14595a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14605a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
14615a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
14625a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle_FullScan) {
14635a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
14643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1465ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1466ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
14673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
14693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
14703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
14713ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
14720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
1473ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
14742f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1475ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1476ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1477ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
14785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
14795a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
14805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
14815a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14825a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
14835a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
14845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(wifi()->IsIdle());
14855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
14865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
14870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith("already connecting or connected.")));
14885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1489df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
14905a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnAfterResume();
14915a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
14925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
14935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
14943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
14953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
14963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1497e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
14983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1499e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
15003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1501e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
15023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1503e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1504e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
1505e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1506e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1507e41a72d0737488d561a4158019409d5785dad61bThieu Le
1508e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1509e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1510e41a72d0737488d561a4158019409d5785dad61bThieu Le
1511e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1512e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1513e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1514e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1515e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1516e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1517e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1518e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1519e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1520e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1521e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1522e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
15233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
15243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
15253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
15263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
15273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
15283c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
15303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
15313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
15323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
15333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
15343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
15353c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
15363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
15373c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
15393c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
15403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
15423c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1544b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1545e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
1546e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1547b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1548e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1549e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
15508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
15538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
15553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
15563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
15573c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
15583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
15593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
15603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
15613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
15638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1565261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1566261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1567261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1568261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
15703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
15713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
15723c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
15733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
15743c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
15753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
15763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
15773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
15783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1579835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1580835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
15813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
1582a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1583835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1584835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
15853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1586835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
15873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
15883c5040174273386868cc8dea8044d22c465885d8Paul Stewart
15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
15900654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1591835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1592835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1593a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  // with this service, and should not request new configuration parameters.
1594a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters()).Times(0);
15953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1597835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1598835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1599835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
16000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
16010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
16023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
16043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
16053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16064943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
16074943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
16084943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
16094943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
16104943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(service.get());
16114943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == NULL);
16124943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
16134943822214f823c2437aa32b0376414b3e60388dPeter Qiu
16144943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectPendingServiceWithFailure) {
16154943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
16164943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(
16174943822214f823c2437aa32b0376414b3e60388dPeter Qiu      SetupConnectingService(DBus::Path(), NULL, NULL));
16184943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_TRUE(GetPendingService() == service.get());
16194943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16204943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
16213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
16220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
16233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
16240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
16250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
16260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
16280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
16293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
16303c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
16313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
16323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
16330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
16383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
16393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService("/new/path", NULL, NULL));
16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
16430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
16443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
16453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
16480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
16500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
16510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
16520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
16533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
16542b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
16550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
16560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16624943822214f823c2437aa32b0376414b3e60388dPeter Qiu  service->set_expecting_disconnect(true);
16630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
16640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
16650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
16660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
16670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1668835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1669835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1670af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
1671af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      new MockSupplicantNetworkProxy());
1672af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan  EXPECT_CALL(*proxy_factory(),
1673af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
1674af14d4573dd3088d081bbaa07adf169fd0beeae8Ben Chan      .WillOnce(ReturnAndReleasePointee(&network_proxy));
1675835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
1676735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
16784943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(_)).Times(0);
16794943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
16804943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
16814943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(NULL, GetCurrentService().get());
16824943822214f823c2437aa32b0376414b3e60388dPeter Qiu  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16834943822214f823c2437aa32b0376414b3e60388dPeter Qiu}
16844943822214f823c2437aa32b0376414b3e60388dPeter Qiu
16854943822214f823c2437aa32b0376414b3e60388dPeter QiuTEST_F(WiFiMainTest, DisconnectCurrentServiceWithFailure) {
16864943822214f823c2437aa32b0376414b3e60388dPeter Qiu  StartWiFi();
16874943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ::DBus::Path kPath("/fake/path");
16884943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
16894943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16904943822214f823c2437aa32b0376414b3e60388dPeter Qiu  InitiateDisconnect(service);
16914943822214f823c2437aa32b0376414b3e60388dPeter Qiu
16924943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // |current_service_| should not change until supplicant reports
16934943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // a BSS change.
16944943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_EQ(service, GetCurrentService());
16954943822214f823c2437aa32b0376414b3e60388dPeter Qiu
16964943822214f823c2437aa32b0376414b3e60388dPeter Qiu  // Expect that the entry associated with this network will be disabled.
16974943822214f823c2437aa32b0376414b3e60388dPeter Qiu  scoped_ptr<MockSupplicantNetworkProxy> network_proxy(
16984943822214f823c2437aa32b0376414b3e60388dPeter Qiu      new MockSupplicantNetworkProxy());
16994943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*proxy_factory(),
17004943822214f823c2437aa32b0376414b3e60388dPeter Qiu              CreateSupplicantNetworkProxy(kPath, WPASupplicant::kDBusAddr))
17014943822214f823c2437aa32b0376414b3e60388dPeter Qiu      .WillOnce(ReturnAndReleasePointee(&network_proxy));
17024943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*network_proxy, SetEnabled(false));
17034943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*eap_state_handler_, Reset());
17044943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
17054943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
17064943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
17070654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
17083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
17093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
17110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1712c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
17133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
17143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
17153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
17163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1717c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
17183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1719c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1720c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1721c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1722c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
1723c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, GetCurrentService().get());
1724c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, wifi()->selected_service().get());
1725c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1726c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
17270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
17280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
17294943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(),
17304943822214f823c2437aa32b0376414b3e60388dPeter Qiu                                                       NULL, NULL));
17314943822214f823c2437aa32b0376414b3e60388dPeter Qiu  MockWiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(),
17324943822214f823c2437aa32b0376414b3e60388dPeter Qiu                                                        NULL, NULL));
17330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
17353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
17370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
17380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
17390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
17402b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
17414943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17424943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
17434943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service0, SetFailure(_)).Times(0);
17444943822214f823c2437aa32b0376414b3e60388dPeter Qiu  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
17454943822214f823c2437aa32b0376414b3e60388dPeter Qiu
17462b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
17472b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
174817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
17499f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
175017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
175117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
17529f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
17539f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, nullptr, nullptr);
175444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
175544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Timeout the connection attempt.
175617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
175717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(service, GetPendingService());
175817d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // Simulate a service with a wifi_ reference calling DisconnectFrom().
175917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _))
176017d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
176117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).Times(0);
176217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should not be called directly from WiFi.
176317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0);
176417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
17650cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
176644f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // Innocuous redundant call to NotifyDeviceScanFinished.
1767a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
176844f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
1769a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
1770a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
1771a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
17720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
17730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _,
17740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                       HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
177517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  pending_timeout.callback().Run();
17760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
177717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  Mock::VerifyAndClearExpectations(service);
17780cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
17790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
17800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
178117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart}
178217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart
178317d9065896fd3fd38fbca2e5d791505888f1bdb6Paul StewartTEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
17842b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
17852b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
17862b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
17873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
17883c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
17892b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
17902b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
179117d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // We expect the service to get a disconnect call, but in this scenario
179217d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // the service does nothing.
17933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
179417d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
179517d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  // DisconnectFrom() should be called directly from WiFi.
179617d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
179717d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
17983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
179917d9065896fd3fd38fbca2e5d791505888f1bdb6Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
18000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
18030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
18043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
18053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
18063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
18070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
18080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
18113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
18133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
18143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
18150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
18160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
18170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
18180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
18193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
18200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
18213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
18220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
18230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
18245c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1825c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
18263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
18273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
18283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
18293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
18303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
18313c5040174273386868cc8dea8044d22c465885d8Paul Stewart
18323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
18333c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
18343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
18353c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1837c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1838b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1839c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
18405c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
18415c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1842549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
18433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
18453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
18463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
18473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
18483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
18493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
18503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
18513c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
18523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1853549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
1854549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1855549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1856549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
1857446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
18583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
18593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
18603c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
18613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
18621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
18630654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
18641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
18650654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
18661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
18670654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
18681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1869446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
18701aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
18710654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
18721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
18733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
18741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
18753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1877446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
1878446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
1879cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
18805a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER_P(HasHiddenSSID_FullScan, ssid, "") {
1881a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
18820654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
1883ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1884ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1885ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1886ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1887ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1888ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1889ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1890ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1891ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1892ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1893ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
18943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
18953c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
18963c5040174273386868cc8dea8044d22c465885d8Paul Stewart
18975a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieMATCHER(HasNoHiddenSSID_FullScan, "") {
18983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
18990654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
19003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
1901ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1902ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
19035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden_FullScan) {
19045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
19063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
19073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
19083c5040174273386868cc8dea8044d22c465885d8Paul Stewart
19093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
19103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
19115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
19125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
19133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
19143c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
19153c5040174273386868cc8dea8044d22c465885d8Paul Stewart
19165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
19175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
19185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanHidden) {
19195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
19205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
19215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
19225a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
19235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
19245a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
19255a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
19265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19275a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
1928ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
19295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
19307347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasHiddenSSID(kNl80211FamilyId), _, _));
19315a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden_FullScan) {
19355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
19365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
19385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillOnce(Return(ByteArrays()));
19395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID_FullScan()));
19405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
19425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// This test is slightly different from the test in scan_session_unittest.cc
19445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie// because this tests the piece of WiFi that builds the SSID list.
19455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanNoHidden) {
19465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Clear the Mock ScanSession because hidden SSIDs are added when wifi
19475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // instantiates a new ScanSession (and it won't instantiate a new ScanSession
19485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // if there's already one there).
19495a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ClearScanSession();
19503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
19513c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
19525a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
19535a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(netlink_manager_,
19547347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie              SendNl80211Message(HasNoHiddenSSID(kNl80211FamilyId), _, _));
1955ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1956ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1957ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1958fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1959fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
1960fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1961fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
1962fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
19633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
19645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
1965fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
1966fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
1967fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
1968fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
1969fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
1970fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
1971fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
19721e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawalTEST_F(WiFiMainTest, ScanRejected) {
19731e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  StartWiFi();
19741e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  ReportScanDone();
19751e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
19761e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
19771e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_))
19781e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal      .WillOnce(Throw(DBus::Error("don't care", "don't care")));
19791e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  TriggerScan(WiFi::kScanMethodFull);
19801e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  dispatcher_.DispatchPendingEvents();
19811e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
19821e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal}
19831e570d40c0b13719ecd34d9df8839283bbc47830mukesh agrawal
19845a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanFound) {
19855a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
19865a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
19875a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
19885a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19895a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
19909f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
19917de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
19925a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
19935a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
19945a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (connects afterwards).
19952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
19965a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
19970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
19985a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
19995a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20005a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Connect after second scan.
2001f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2002df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
2003df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2004df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2005f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
20065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetPendingService(service);
20075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Verify that the third scan aborts and there is no further scan.
20095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ScopedMockLog log;
20105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
20115a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(log, Log(_, _, EndsWith(
20125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      "Ignoring scan request while connecting to an AP."))).Times(1);
20135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20140cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
20155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanNotFound) {
20185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Set min & max scan frequency count to 1 so each scan will be of a single
20195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // frequency.
20205a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetScanSize(1, 1);
20215a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
202244f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  // This test never connects
202344f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _)).Times(0);
202444f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
202544f290d07875cd3a6dc21c36ed0364a6ac5c31faWade Guthrie
20265a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the first scan (finds nothing).
20279f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
20285a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
20295a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20305a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the second scan (finds nothing).
20312ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, true);
20327de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_)).Times(0);
20335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20340cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
20355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
20365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // Do the third scan. After (simulated) exhausting of search frequencies,
20385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // verify that this scan uses supplicant rather than internal (progressive)
20395a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // scan.
20405a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, HasMoreFrequencies()).WillOnce(Return(false));
20415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
20425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
20435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
20440cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning,
20450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie                  WiFi::kScanMethodProgressiveFinishedToFull);
20465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20475a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // And verify that ScanDone reports a complete scan (i.e., the
20485a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  // wifi_::scan_session_ has truly been cleared).
2049a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
2050a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
20515a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDoneKeepScanSession();
20520cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
20530cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
20545a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20555a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanError) {
20570cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
20580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ClearScanSession();  // Clear Mock ScanSession to get an actual ScanSession.
20592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartWiFi();  // Posts |ProgressiveScanTask|.
20602ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
20612ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(netlink_manager_, SendNl80211Message(
20622ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_TRIGGER_SCAN), _, _));
20632ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Executes |ProgressiveScanTask|.
20645a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20652ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Calls |WiFi::OnFailedProgressiveScan| which calls |ScanTask|
20662ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
20675a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  NewScanResultsMessage not_supposed_to_get_this_message;
20685a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  OnTriggerScanResponse(not_supposed_to_get_this_message);
20690cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressiveErrorToFull);
20705a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
20720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
20732ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Post and execute |UpdateScanStateAfterScanDone|.
20740cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDoneKeepScanSession();
20752ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
20760cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
20775a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
20785a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
20797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
20807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
20817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
20827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
20837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
20847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
20850654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
20860654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
20877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
20887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
20897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
20907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
20917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
20927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2093f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
20947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
20957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
20960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
20977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
20987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
20997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
2100d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
21017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
21027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
21037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
21047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
21057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
210675a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _)).Times(AnyNumber());
2107d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
21087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
21097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
2110f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2111bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2112bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2113bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
21147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
21150654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
21160654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
21170654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
21187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
21197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
21207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
21213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
21223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
21237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
21247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2125a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
2126a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2127a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2128a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2129f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2130a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2131a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2132a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2133a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
2134a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2135a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2136a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2137a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
2138a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
2139a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
2140a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
2141a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2142a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2143a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
2144a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
2145f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2146a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21470654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
21480654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
2149a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
2150a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
2151a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
2152a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
2153a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
2154a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2155a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetPendingService(NULL);
2156a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
2157a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
2158a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
21592ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // level of supplicant debugging.
2160a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21610654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
21620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
2163a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
21640654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2165a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
2166a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
21671590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
21681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
21693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
21703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
21713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL);
21721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
21734943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
21740654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
21751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
21761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
2177687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
21781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
21791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
21801590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
21811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
21823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
21833c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
21843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
21853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
21863c5040174273386868cc8dea8044d22c465885d8Paul Stewart      0, 0, kNetworkModeAdHoc, NULL, &service1));
21873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
21881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2189c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
2190c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
2191c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
2192c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
21933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
21943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
21953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
2196bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service1, ResetSuspectedCredentialFailures());
2197a5dda0e9b074fa2c5a4279470f1916c66cb14013mukesh agrawal  EXPECT_CALL(*wifi_provider(), IncrementConnectCount(_));
21980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
21993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
2200687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
22013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
22023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
22031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
22041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2205e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
2206e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
22070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
22080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
22090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
22103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
22113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
22123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
22133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
22143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
22153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
22163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
2217687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_TRUE(GetIsRoamingInProgress());
22180cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
2219687350531096cacc379c209e39e63e5316eee5c0Paul Stewart
2220687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // If we report a "completed" state change on a connected service after
2221687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  // wpa_supplicant has roamed, we should renew our IPConfig.
2222687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  scoped_refptr<MockIPConfig> ipconfig(
2223687350531096cacc379c209e39e63e5316eee5c0Paul Stewart      new MockIPConfig(control_interface(), kDeviceName));
2224687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  SetIPConfig(ipconfig);
2225687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
2226687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_CALL(*ipconfig, RenewIP());
2227687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2228687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  Mock::VerifyAndClearExpectations(ipconfig);
2229687350531096cacc379c209e39e63e5316eee5c0Paul Stewart  EXPECT_FALSE(GetIsRoamingInProgress());
22304eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
22314eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
22328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
22338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
22343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
22353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
22363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
22378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
22383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
22393c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
22403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
22413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
22428a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
22438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
22448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
22458a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
22468a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
22473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
22483c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
22498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
22508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
22518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
22524a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
22530654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
22549d97b7deda3ae604d718873207a951f62d418b34Paul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyDisableVHT) &&
22550654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
22564d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
22574d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
22584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
22594d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
22603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
22613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
2262a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
22633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
22640654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
22654d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
22664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
22674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
22684a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
22694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
22703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
22713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
2272a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
22733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
22744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
22754a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
22764a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
22774a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
22784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
2279f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
22804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
22814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
22824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
22833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
22843c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
22853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
22860654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
22874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
22884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
22894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
22904a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
22913c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
22923c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
22933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
22944a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
22954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
22964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
22970654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
22984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
22994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
23004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
23014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
23024a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
23034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
23044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
23054a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
23064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
23074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
23080654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
23094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
23103c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
23113c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
23123c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
23134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
23144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
23154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
23160654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
23174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
23184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
23194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
23204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
23214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
23224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
23234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
23245c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
23255c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
23260654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
23275c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
23283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
23295c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
23303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
23315c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
23325c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
23335c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
23340654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
23355c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
23365c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
23374a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
23384a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
2339c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2340c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
23413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
23423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
2343c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2344c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2345c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
2346c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2347c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
2348c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
2349c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
2350c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2351c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2352c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
2353c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
23543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
23553c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
23568f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
2357c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
23588f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
23598f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
23600654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
23615519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
23623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
23633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
23643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
23658f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
23668f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
23675519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
23685519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
23693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
23703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
23713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
23720654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2373c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
2374c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
2375b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2376b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2377b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
2378b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
2379b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2380b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2381b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
2382b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2383b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2384b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
2385b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2386b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2387b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
2388b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
2389b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2390b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
2391b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
23923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
23933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
23943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
23953c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
23963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
2397b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
2398b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
2399b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
2400b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
2401b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
24025c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
24035c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
24045c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
24055c05b2920be742d518829972127172481722058dmukesh agrawal
24065c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
24075c05b2920be742d518829972127172481722058dmukesh agrawal
24085c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
24095c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
24105c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
24113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
24125c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
24132f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
24145c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
24155c05b2920be742d518829972127172481722058dmukesh agrawal}
24165c05b2920be742d518829972127172481722058dmukesh agrawal
24175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle_FullScan) {
24185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
2419b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2420b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2421b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2422b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2423b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2424b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
24257de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
24260cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2427b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2428b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2429b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2430b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2431b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2432b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
24335a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanTimerIdle) {
24345a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
24355a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
24365a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
24375a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  CancelScanTimer();
24385a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_TRUE(GetScanTimer().IsCancelled());
24390cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();
2440df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
24415a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
24425a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  FireScanTimer();
24435a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
24445a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
24455a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
24465a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2447b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
2448b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2449b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2450b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2451b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2452b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2453b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
2454b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
2455b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
24565a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2457b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2458b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2459b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2460b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2461b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2462b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
2463b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2464b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
24653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
24663c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL);
2467b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2468b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2469b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2470b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
24715a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
2472b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
2473b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2474b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
2475b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2476b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2477b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
2478b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2479b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2480b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2481b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2482bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(1, NULL);
2483b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2484b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2485b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2486b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2487b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2488b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
2489b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2490b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2491b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
2492b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2493b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2494b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2495b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2496b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2497b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
2498b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2499bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  SetScanInterval(0, NULL);
2500b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
2501b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2502b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
25035a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade GuthrieTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden_FullScan) {
25045a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EnableFullScan();
25055a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  StartWiFi();
25065a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25075a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  SetupConnectedService(DBus::Path(), NULL, NULL);
25085a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  vector<uint8_t>kSSID(1, 'a');
25095a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ByteArrays ssids;
25105a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ssids.push_back(kSSID);
2511a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
25125a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25135a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie      .WillRepeatedly(Return(ssids));
25145a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
25155a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie              Scan(HasHiddenSSID_FullScan(kSSID)));
25165a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
25175a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  dispatcher_.DispatchPendingEvents();
25185a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie}
25195a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie
2520b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2521b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2522b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
25235a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  ReportScanDone();
25243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
2525df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InstallMockScanSession();
25263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
25273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
25283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
2529a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
25303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25313c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
25325a4e2efdb3b7d144a853c9b9e70edbd7be12f4c0Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan());
25330654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2534b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2535b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2536b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
2537b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2538b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
2539b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
25403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
2541b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2542df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
25433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
25443c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
25450654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2546b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2547b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
2548b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
25493c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
25503c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  StartWiFi();
25513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
25523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
25533c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
25543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
25553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
25563c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
25573c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
25583c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
25593c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
2560daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
25613c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
25623c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2563daa14ee5563728284964c59771e36691595e4188Peter Qiu                       EndsWith("Called Reattach()."))).Times(1);
2564daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(1);
25653c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
25663c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnSupplicantVanish();
25673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
2568daa14ee5563728284964c59771e36691595e4188Peter Qiu  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reattach()).Times(0);
25693c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
25703c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Cannot reassociate."))).Times(1);
25713c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
25723c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
25733c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
2574cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2575f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
2576bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2577bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2578cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2579cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2580bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWPA) {
2581f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
25820654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2583bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2584bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false))
2585bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(true));
2586bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
25871369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2588bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
25891369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
2590cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2591cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2592f6f9648d5b2beb387ada690b8a20482c694433f1Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsWEP) {
2593f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  StartWiFi();
2594f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  dispatcher_.DispatchPendingEvents();
2595f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWep);
2596a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
2597f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  InitiateConnect(service);
2598f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  SetCurrentService(service);
2599f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2600f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // These expectations are very much like SetupConnectedService except
2601f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // that we verify that ResetSupsectCredentialFailures() is not called
2602f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // on the service just because supplicant entered the Completed state.
2603f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2604f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
260575a68b9f230c7715cc24feee8a713e75e6e7f231Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _, _)).Times(AnyNumber());
2606f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
2607f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
2608f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2609f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2610f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
2611f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2612f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(device_info());
2613f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2614f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2615f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Successful connect.
2616f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
2617f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures());
2618f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportConnected();
2619f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2620f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*device_info(), GetByteCounts(_, _, _))
2621f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(1LL), Return(true)))
2622f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)))
2623f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(0LL), Return(true)));
2624f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2625f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // If there was an increased byte-count while we were timing out DHCP,
2626f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // this should be considered a DHCP failure and not a credential failure.
2627f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, ResetSuspectedCredentialFailures()).Times(0);
2628f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _));
2629f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2630f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2631f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2632f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP but service does not (yet) believe this is
2633f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // due to a passphrase issue.
2634f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2635f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(false));
2636f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP, _));
2637f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2638f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  Mock::VerifyAndClearExpectations(service);
2639f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
2640f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // Connection failed during DHCP and service believes this is due to a
2641f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  // passphrase issue.
2642f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2643f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart      .WillOnce(Return(true));
2644f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  EXPECT_CALL(*service,
2645f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart              DisconnectWithFailure(Service::kFailureBadPassphrase, _));
2646f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart  ReportIPConfigFailure();
2647f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart}
2648f6f9648d5b2beb387ada690b8a20482c694433f1Paul Stewart
26491369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
2650f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
2651735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2652735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2653735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true))
2654735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(false))
2655735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2656bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2657bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2658bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2659bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2660bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
26611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
2662bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_TRUE(SuspectCredentials(service, &failure));
26631369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
2664bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2665bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2666bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).Times(0);
2667bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
2668bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  Mock::VerifyAndClearExpectations(service);
2669bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart
2670bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure())
2671bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart      .WillOnce(Return(false));
2672bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_FALSE(SuspectCredentials(service, NULL));
26731369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
26741369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
26751369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
2676f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityWpa);
2677cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
26780654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
2679cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2680a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
2681bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2682f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
26834943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2684735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2685cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2686f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith(kErrorBadPassphrase)));
26870654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
26881369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
26891369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
26901369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
2691f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
26921369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
26931369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
2694735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ScopedMockLog log;
2695735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
26964943822214f823c2437aa32b0376414b3e60388dPeter Qiu  EXPECT_CALL(*service, SetState(Service::kStateIdle));
2697735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // Ensure that we retrieve is_eap_in_progress() before resetting the
2698735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  // EAP handler's state.
2699735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  InSequence seq;
2700735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
2701735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(Return(true));
2702bca08f806803aa8f78dc563c9d1a3acf8e1ebe97Paul Stewart  EXPECT_CALL(*service, AddSuspectedCredentialFailure()).WillOnce(Return(true));
2703735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
27041369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
270539a7beb18a0c24c9b73c3cc49008ccdca19f9ac2Ben Chan                       EndsWith(kErrorEapAuthenticationFailed)));
2706735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, Reset());
27070654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
2708cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
2709cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
2710e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
2711e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
27121aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
2713e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
27141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
2715e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2716e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
2717e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
2718e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2719e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
2720e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
2721e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
27221aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
2723e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
2724e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
2725e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2726e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2727e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
2728e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
2729e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
2730e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
2731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
2732e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
2733e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
2734e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
2735e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2736e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
2737e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2738e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
2739e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
2740e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2741e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2742e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
2743e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2744e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
2745e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2746e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
2747e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2748e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
2749e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
2750e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
2751e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
2752e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2753e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
27541aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
2755e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
2756e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
2757e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
2758e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2759e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2760e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2761e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
2762e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2763e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2764e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2765e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
2766e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2767e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2768e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2769e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
2770e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2771e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2772e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2773e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
27741aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
27751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
27761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
27773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
27783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
27791aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
27801aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
27811aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
27821aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
27831aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
27841aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
27851aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
27861aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
27871aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
27881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
27891aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
27901aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
27911aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
27921aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
27931aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
27941aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
27951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
27961aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
27971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
27981aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
27991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
28001aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
28011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
28021aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
28037cd4572126da015b195caf82449c14b4065c4c59Paul StewartTEST_F(WiFiTimerTest, RequestStationInfo) {
28047cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
28057cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
28067cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28077cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Setup a connected service here while we have the expectations above set.
28087cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  StartWiFi();
28097cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  MockWiFiServiceRefPtr service =
28107cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
28117cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  string connected_bss = GetSupplicantBSS();
28127cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
28137cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28147cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(_, _, _)).Times(0);
28157cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
28167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NiceScopedMockLog log;
28177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // There is no current_service_.
28197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
28207cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(NULL);
28217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
28227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28232ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // current_service_ is not connected.
28247cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(false));
28257cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetCurrentService(service);
28267cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr("we are not connected")));
28277cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
28287cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28297cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Endpoint does not exist in endpoint_by_rpcid_.
28307cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
28317cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS("/some/path/that/does/not/exist/in/endpoint_by_rpcid");
28327cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(log, Log(_, _, HasSubstr(
28337cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      "Can't get endpoint for current supplicant BSS")));
28347cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
28357cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&netlink_manager_);
28367cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
28377cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28387cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // We successfully trigger a request to get the station and start a timer
28397cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // for the next call.
28407cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(netlink_manager_, SendNl80211Message(
28417cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      IsNl80211Command(kNl80211FamilyId, NL80211_CMD_GET_STATION), _, _));
28427cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
28437cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      _, WiFi::kRequestStationInfoPeriodSeconds * 1000));
28447cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  SetSupplicantBSS(connected_bss);
28457cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  RequestStationInfo();
28467cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
28477cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Now test that a properly formatted New Station message updates strength.
28487cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  NewStationMessage new_station;
28497cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
28507cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
2851baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Confirm that up until now no link statistics exist.
2852baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  KeyValueStore link_statistics = GetLinkStatistics();
2853baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_TRUE(link_statistics.IsEmpty());
2854baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
28557cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // Use a reference to the endpoint instance in the WiFi device instead of
28567cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  // the copy returned by SetupConnectedService().
28577cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  WiFiEndpointRefPtr endpoint = GetEndpointMap().begin()->second;
28587cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetRawAttributeValue(
28597cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
28607cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->CreateNestedAttribute(
28617cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, "Station Info");
28627cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListRefPtr station_info;
28637cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->GetNestedAttributeList(
28647cd4572126da015b195caf82449c14b4065c4c59Paul Stewart      NL80211_ATTR_STA_INFO, &station_info);
28657cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
2866baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalValue = -20;
28677cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
2868baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL_AVG, "SignalAverage");
2869baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int kSignalAvgValue = -40;
2870baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL_AVG,
2871baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                    kSignalAvgValue);
2872baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_INACTIVE_TIME,
2873baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "InactiveTime");
2874baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kInactiveTime = 100;
2875baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_INACTIVE_TIME,
2876baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kInactiveTime);
2877baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_RX_PACKETS,
2878baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "ReceivedSuccesses");
2879baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kReceiveSuccesses = 200;
2880baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_RX_PACKETS,
2881baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kReceiveSuccesses);
2882baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_FAILED,
2883baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitFailed");
2884baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitFailed = 300;
2885baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_FAILED,
2886baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitFailed);
2887baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_PACKETS,
2888baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitSuccesses");
2889baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitSuccesses = 400;
2890baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_PACKETS,
2891baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitSuccesses);
2892baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateU32Attribute(NL80211_STA_INFO_TX_RETRIES,
2893baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                   "TransmitRetries");
2894baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int32_t kTransmitRetries = 500;
2895baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetU32AttributeValue(NL80211_STA_INFO_TX_RETRIES,
2896baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                     kTransmitRetries);
2897baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
2898baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                                      "Bitrate Info");
2899baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
2900baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  // Embed transmit bitrate info within the station info element.
2901baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  AttributeListRefPtr bitrate_info;
2902baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->GetNestedAttributeList(
2903baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
2904baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU16Attribute(NL80211_RATE_INFO_BITRATE, "Bitrate");
2905baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kBitrate = 6005;
2906baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU16AttributeValue(NL80211_RATE_INFO_BITRATE, kBitrate);
2907baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_MCS, "MCS");
2908baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  const int16_t kMCS = 7;
2909baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_MCS, kMCS);
2910baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_40_MHZ_WIDTH, "HT40");
2911baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_40_MHZ_WIDTH, true);
2912baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
2913baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
2914baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
2915baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
29167cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  new_station.attributes()->SetNestedAttributeHasAValue(NL80211_ATTR_STA_INFO);
29177cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
29187cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_NE(kSignalValue, endpoint->signal_strength());
29197cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
29208e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
29217cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  AttributeListConstRefPtr station_info_prime;
29227cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  ReportReceivedStationInfo(new_station);
29237cd4572126da015b195caf82449c14b4065c4c59Paul Stewart  EXPECT_EQ(kSignalValue, endpoint->signal_strength());
2924baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart
2925baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  link_statistics = GetLinkStatistics();
2926baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_FALSE(link_statistics.IsEmpty());
2927baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kLastReceiveSignalDbmProperty));
2928baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalValue,
2929baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kLastReceiveSignalDbmProperty));
2930baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsInt(kAverageReceiveSignalDbmProperty));
2931baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kSignalAvgValue,
2932baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetInt(kAverageReceiveSignalDbmProperty));
2933baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kInactiveTimeMillisecondsProperty));
2934baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kInactiveTime,
2935baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kInactiveTimeMillisecondsProperty));
2936baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketReceiveSuccessesProperty));
2937baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kReceiveSuccesses,
2938baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketReceiveSuccessesProperty));
2939baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitFailuresProperty));
2940baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitFailed,
2941baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitFailuresProperty));
2942baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kPacketTransmitSuccessesProperty));
2943baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitSuccesses,
2944baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kPacketTransmitSuccessesProperty));
2945baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  ASSERT_TRUE(link_statistics.ContainsUint(kTransmitRetriesProperty));
2946baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(kTransmitRetries,
2947baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.GetUint(kTransmitRetriesProperty));
2948baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart  EXPECT_EQ(StringPrintf("%d.%d MBit/s MCS %d 40MHz",
2949baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart                         kBitrate / 10, kBitrate % 10, kMCS),
2950baf87071d410a58b62fdf78f7e27fb95dc0a032ePaul Stewart            link_statistics.LookupString(kTransmitBitrateProperty, ""));
2951e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
2952e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // New station info with VHT rate parameters.
2953e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  NewStationMessage new_vht_station;
2954e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateRawAttribute(NL80211_ATTR_MAC, "BSSID");
2955e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
2956e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetRawAttributeValue(
2957e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_MAC, ByteString::CreateFromHexString(endpoint->bssid_hex()));
2958e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->CreateNestedAttribute(
2959e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, "Station Info");
2960e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->GetNestedAttributeList(
2961e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO, &station_info);
2962e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateU8Attribute(NL80211_STA_INFO_SIGNAL, "Signal");
2963e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetU8AttributeValue(NL80211_STA_INFO_SIGNAL, kSignalValue);
2964e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->CreateNestedAttribute(NL80211_STA_INFO_TX_BITRATE,
2965e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                                      "Bitrate Info");
2966e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
2967e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  // Embed transmit VHT bitrate info within the station info element.
2968e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->GetNestedAttributeList(
2969e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_STA_INFO_TX_BITRATE, &bitrate_info);
2970e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU32Attribute(NL80211_RATE_INFO_BITRATE32, "Bitrate32");
2971e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int32_t kVhtBitrate = 70000;
2972e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU32AttributeValue(NL80211_RATE_INFO_BITRATE32, kVhtBitrate);
2973e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_MCS, "VHT-MCS");
2974e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtMCS = 7;
2975e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_MCS, kVhtMCS);
2976e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateU8Attribute(NL80211_RATE_INFO_VHT_NSS, "VHT-NSS");
2977e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  const int8_t kVhtNSS = 1;
2978e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetU8AttributeValue(NL80211_RATE_INFO_VHT_NSS, kVhtNSS);
2979e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_80_MHZ_WIDTH, "VHT80");
2980e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_80_MHZ_WIDTH, true);
2981e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->CreateFlagAttribute(NL80211_RATE_INFO_SHORT_GI, "SGI");
2982e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  bitrate_info->SetFlagAttributeValue(NL80211_RATE_INFO_SHORT_GI, false);
2983e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  station_info->SetNestedAttributeHasAValue(NL80211_STA_INFO_TX_BITRATE);
2984e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
2985e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  new_vht_station.attributes()->SetNestedAttributeHasAValue(
2986e50623a9e038964c729c17f850f140f62440e3afPeter Qiu      NL80211_ATTR_STA_INFO);
2987e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
29888e43058d862502b49c769742f6d5e61e28286254Peter Qiu  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
29898e43058d862502b49c769742f6d5e61e28286254Peter Qiu
2990e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  ReportReceivedStationInfo(new_vht_station);
2991e50623a9e038964c729c17f850f140f62440e3afPeter Qiu
2992e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  link_statistics = GetLinkStatistics();
2993e50623a9e038964c729c17f850f140f62440e3afPeter Qiu  EXPECT_EQ(StringPrintf("%d.%d MBit/s VHT-MCS %d 80MHz VHT-NSS %d",
2994e50623a9e038964c729c17f850f140f62440e3afPeter Qiu                         kVhtBitrate / 10, kVhtBitrate % 10, kVhtMCS, kVhtNSS),
2995e50623a9e038964c729c17f850f140f62440e3afPeter Qiu            link_statistics.LookupString(kTransmitBitrateProperty, ""));
29967cd4572126da015b195caf82449c14b4065c4c59Paul Stewart}
29977cd4572126da015b195caf82449c14b4065c4c59Paul Stewart
2998bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
2999f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3000bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
3001bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3002bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
3003bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3004bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
3005bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3006bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3007bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3008bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
3009bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
3010bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3011bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3012bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3013bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
30140654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
3015bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3016bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
3017bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
3018bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3019bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
3020bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3021bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
30220654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
3023bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
3024bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
3025bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
3026db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
3027db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3028db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
302911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  StartWiFi();
3030db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
3031db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
3032735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
3033735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPStatus("eap-status");
3034735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  const string kEAPParameter("eap-parameter");
3035735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3036db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
3037db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3038db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3039f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurity8021x);
3040db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
3041735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
3042db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
3043735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3044735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(service);
3045735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  Mock::VerifyAndClearExpectations(eap_state_handler_);
3046db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
3047735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
3048735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
3049735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart                Return(false)));
3050735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
3051735eab54bf8b9d9b8e7c7aff7c562333bfa9e119Paul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
305211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
305311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  MockEapCredentials *eap = new MockEapCredentials();
305411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  service->eap_.reset(eap);  // Passes ownership.
305511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const char kNetworkRpcId[] = "/service/network/rpcid";
305611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  SetServiceNetworkRpcId(service, kNetworkRpcId);
305711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
305811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
305911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
306011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
306111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kEmptyPin;
306211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kEmptyPin));
306311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailurePinMissing, _));
306411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
306511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart
306611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
306711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailurePinMissing),
306811c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                Return(false)));
306911c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  // We need a real string object since it will be returned by reference below.
307011c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  const string kPin("000000");
307111c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*eap, pin()).WillOnce(ReturnRef(kPin));
307211c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
307311c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
307411c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart              NetworkReply(StrEq(kNetworkRpcId),
307511c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           StrEq(WPASupplicant::kEAPRequestedParameterPIN),
307611c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart                           Ref(kPin)));
307711c224b7054a3f0dc5a34c2903e13f74376db27ePaul Stewart  ReportEAPEvent(kEAPStatus, kEAPParameter);
3078bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
3079bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
3080c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
3081c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
3082c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
3083c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
3084c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
3085c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
3086c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
3087c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
3088c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
3089c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
3090c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
3091c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
30926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
30936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
30946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
30956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
30966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
30976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  uint16 frequency;
30986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
30996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
31006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
31016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
31026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
31036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
31046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
31056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
31066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
31076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
31086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
31096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
31106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
31116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
31126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
31136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
31146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
31156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
31166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
31176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
31186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
31196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
31206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
31216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
31226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
31236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
31246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
31256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
31266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
31276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
31287347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie  }
31297347bf2b466ae8058e47b29aaf0583390405d866Wade Guthrie}
31306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
31315581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
31325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
31335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
31355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
31365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
31375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
31385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
31415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
31425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
31430654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
31445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
31455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
31465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
31475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
31495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
31505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
31510654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
31520654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
31530654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
31540654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
31550654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
31560654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
31570654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
31580654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
31595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
31605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
31695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
31715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
31725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
31730654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
31740654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
31755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
31765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
31785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
31805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
31815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
31820654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
31830654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
31845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
31855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
31875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
31895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
31905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
31910654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
31920654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
31935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
31945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
31955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
31965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
31975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
31985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
31995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
32005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
32015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
32025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
32035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
32045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
320550cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
320650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
320750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
320850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
320950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
3210bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
3211bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
3212bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiFiMainTest, CustomSetterNoopChange) {
3213bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanShortInterval
3214bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3215bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3216bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const uint16 kKnownScanInterval = 4;
3217bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3218bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanShortInterval(kKnownScanInterval, &error));
3219bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3220bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3221bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanShortInterval(kKnownScanInterval, &error));
3222bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3223bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3224bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3225bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetBgscanSignalThreshold
3226bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3227bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3228bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    static const int32 kKnownSignalThreshold = 4;
3229bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to known value.
3230bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3231bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3232bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    // Set to same value.
3233bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetBgscanSignalThreshold(kKnownSignalThreshold, &error));
3234bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3235bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3236bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
3237bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  // SetScanInterval
3238bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  {
3239bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    Error error;
3240bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_FALSE(SetScanInterval(GetScanInterval(), &error));
3241bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal    EXPECT_TRUE(error.IsSuccess());
3242bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  }
3243bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
3244bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
32450cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie// The following tests check the scan_state_ / scan_method_ state machine.
32460cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32470cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanFindsNothing) {
32489f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
32490cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportScanDone();
3250a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3251a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3252a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3253a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3254a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
32550cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
32560cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("FULL_NOCONNECTION ->")));
32577de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
32580cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
32590cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
32600cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32610cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
32620cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
32630cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
32640cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32650cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, FullScanConnectingToConnected) {
32669f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodFull);
32670cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
32680cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
32699f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(WiFi::kScanMethodFull,
32709f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &endpoint,
32719f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie                                                    &bss_path);
32720cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32730cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3274a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
32750cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3276a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3277a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3278a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
32790cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
32800cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> FULL_CONNECTED")));
32810cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
32820cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
32830cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32840cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
32850cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
32860cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
32870cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32880cf3c98ce0b783e4c1a60f536564377220191cb4Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToConnected) {
32899f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
32900cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  WiFiEndpointRefPtr endpoint;
32910cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ::DBus::Path bss_path;
32929f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
32939f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, &bss_path);
32940cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
32950cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  // Complete the connection.
3296a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
32970cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
3298a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3299a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3300a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
33010cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
33020cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTED")));
33030cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ReportCurrentBSSChanged(bss_path);
33040cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
33050cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
33060cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
33070cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
33080cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie}
33090cf3c98ce0b783e4c1a60f536564377220191cb4Wade Guthrie
3310df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanConnectingToNotFound) {
33119f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3312df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
33139f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  MockWiFiServiceRefPtr service = AttemptConnection(
33149f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie      WiFi::kScanMethodProgressive, &endpoint, nullptr);
3315df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3316df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Simulate connection timeout.
3317a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3318a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*service,
3319a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie              NotifyCurrentEndpoint(EndpointMatch(endpoint))).Times(0);
33209f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3321df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3322df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3323df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3324df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log,
3325df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              Log(_, _, HasSubstr("-> PROGRESSIVE_FINISHED_NOCONNECTION")));
3326df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_)).Times(0);
3327df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  TimeoutPendingConnection();
3328df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3329df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3330df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3331df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3332df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3333b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade GuthrieTEST_F(WiFiMainTest, ScanStateUma) {
3334b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3335b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie      Times(0);
3336df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_));
3337b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive, __func__);
3338b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3339df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_));
3340df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3341df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive, __func__);
3342df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3343a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3344df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3345b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _));
3346b0def9f121674d7f9f38b0ccbc169a567c07789fWade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodProgressive, __func__);
3347b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie}
3348b9e0ee7f0418f3fe62dfde62fe8bc916fb2801fdWade Guthrie
3349df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateNotScanningNoUma) {
3350df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3351df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectStarted(_, _));
3352df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnecting, WiFi::kScanMethodNone, __func__);
3353df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3354a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // After connected.
3355df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceConnectFinished(_));
3356df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3357df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3358df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetScanState(WiFi::kScanConnected, WiFi::kScanMethodNone, __func__);
3359df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3360df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3361df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToServiceNotPending) {
3362df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Test for SetPendingService(NULL), condition a)
3363df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // |ConnectTo|->|DisconnectFrom|.
33649f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3365df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3366df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup pending service.
3367a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3368a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3369df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_pending(
3370df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), NULL, NULL));
3371df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_pending.get(), GetPendingService().get());
3372df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3373df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // ConnectTo a different service than the pending one.
3374a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3375a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
33769f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  NiceScopedMockLog log;
3377df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3378df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3379df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3380df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING")));
3381df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> PROGRESSIVE_CONNECTING")));
3382df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service_connecting(
3383df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), NULL, NULL));
3384df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3385df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3386df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(service_connecting.get(), GetPendingService().get());
3387df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_EQ(NULL, GetCurrentService().get());
3388df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3389a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3390a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();  // To silence messages from the destructor.
3391df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3392df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3393df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectToWithError) {
33949f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3395df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3396a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3397df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).
3398df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      WillOnce(Throw(
3399df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie          DBus::Error(
3400df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "fi.w1.wpa_supplicant1.InterfaceUnknown",
3401df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
3402df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3403df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3404df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3405f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kScanningProperty, false));
3406f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3407a283e4e59a4b4cefaf9fa1fa40e0dc5ae3647d1fPaul Stewart  EXPECT_CALL(*service, GetSupplicantConfigurationParameters());
3408df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  InitiateConnect(service);
3409df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3410df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_TRUE(IsScanSessionNull());
3411df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3412df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3413df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ScanStateHandleDisconnect) {
3414df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Test for SetPendingService(NULL), condition d) Disconnect while scanning.
3415df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Start scanning.
34169f4aa159da8d06e75095a1210cff94e39f2899e9Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
3417df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3418df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Set the pending service.
3419df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDoneKeepScanSession();
3420a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3421a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3422f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  MockWiFiServiceRefPtr service = MakeMockService(kSecurityNone);
3423df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  SetPendingService(service);
3424df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanConnecting, WiFi::kScanMethodProgressive);
3425df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3426df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Disconnect from the pending service.
3427a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanIdle();
3428df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanFinished(_)).Times(0);
3429df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), SendEnumToUMA(Metrics::kMetricScanResult, _, _)).
3430df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3431df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
3432df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3433df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3434df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3435df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade GuthrieTEST_F(WiFiMainTest, ConnectWhileNotScanning) {
3436df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Setup WiFi but terminate scan.
3437f024ef470665bee08eeb9cdfe5bbcc3fd7bbc8fdBen Chan  EXPECT_CALL(*adaptor_, EmitBoolChanged(kPoweredProperty, _)).
3438a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie      Times(AnyNumber());
3439a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
34402ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStart(WiFi::kScanMethodProgressive, false);
3441df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  StartWiFi();
3442a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  dispatcher_.DispatchPendingEvents();
3443a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie
3444a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectScanStop();
3445a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectFoundNothing();
3446df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportScanDone();
3447df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  dispatcher_.DispatchPendingEvents();
3448a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3449df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3450df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connecting.
3451a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnecting();
3452df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(*metrics(), NotifyDeviceScanStarted(_)).Times(0);
3453df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  WiFiEndpointRefPtr endpoint;
3454df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ::DBus::Path bss_path;
3455a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  NiceScopedMockLog log;
3456df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("wifi");
3457df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(10);
3458df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
3459df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> TRANSITION_TO_CONNECTING"))).
3460df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      Times(0);
3461df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTING (not scan related)")));
3462df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  MockWiFiServiceRefPtr service =
3463df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie      SetupConnectingService(DBus::Path(), &endpoint, &bss_path);
3464df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
3465df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  // Connected.
3466a5995cf4c3b4b5d5660ad02b7d108cbd9352e2ebWade Guthrie  ExpectConnected();
3467df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  EXPECT_CALL(log, Log(_, _, HasSubstr("-> CONNECTED (not scan related")));
3468df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ReportCurrentBSSChanged(bss_path);
3469df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->set_verbose_level(0);
3470df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
3471df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
3472df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie}
3473df6d61b1f9ba1626754d8e8af17ab68fcbe08386Wade Guthrie
34743bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul StewartTEST_F(WiFiMainTest, BackgroundScan) {
34753bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  StartWiFi();
34763bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
34773bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
34783bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
34793bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
34802ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
34813bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();
34823bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanBackgroundScanning, WiFi::kScanMethodFull);
34833bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
34843bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  ReportScanDone();
34857de7e02e14074989757a4f9f220de2310cc05236Paul Stewart  EXPECT_CALL(*manager(), OnDeviceGeolocationInfoUpdated(_));
34863bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  dispatcher_.DispatchPendingEvents();  // Launch UpdateScanStateAfterScanDone
34873bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart  VerifyScanState(WiFi::kScanIdle, WiFi::kScanMethodNone);
34883bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart}
34893bdd3aa13ad8a17a21064bb5e40621bbd3e3be39Paul Stewart
34902ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, ProgressiveScanDuringFull) {
34912ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodFull);
34922ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
34932ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a progressive scan.
34942ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
34952ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
34962ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodProgressive);
34972ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
34982ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodFull);
34992ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
35002ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
35012ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
35022ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
35032ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
35042ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
35052ef88ad22a7e5f012e2daba04363380f0e6e3135Wade GuthrieTEST_F(WiFiMainTest, FullScanDuringProgressive) {
35062ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  StartScan(WiFi::kScanMethodProgressive);
35072ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
35082ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // Now, try to slam-in a full scan.
35092ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*scan_session_, InitiateScan()).Times(0);
35102ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
35112ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  TriggerScan(WiFi::kScanMethodFull);
35122ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  dispatcher_.DispatchPendingEvents();
35132ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  VerifyScanState(WiFi::kScanScanning, WiFi::kScanMethodProgressive);
35142ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
35152ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  // And, for the destructor.
35162ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanStop();
35172ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie  ExpectScanIdle();
35182ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie}
35192ef88ad22a7e5f012e2daba04363380f0e6e3135Wade Guthrie
3520c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, TDLSInterfaceFunctions) {
3521df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  StartWiFi();
3522df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kPeer[] = "peer";
3523df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3524df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3525df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3526df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3527df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3528df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3529df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3530df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSDiscover(kPeer));
3531df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSDiscover(kPeer));
3532df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3533df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3534df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3535df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3536df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3537df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3538df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3539df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3540df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSSetup(kPeer));
3541df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSSetup(kPeer));
3542df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3543df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3544df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  const char kStatus[] = "peachy keen";
3545df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3546df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return(kStatus))
3547df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3548df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3549df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3550df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3551df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ(kStatus, TDLSStatus(kPeer));
3552df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_EQ("", TDLSStatus(kPeer));
3553df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3554df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3555df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3556df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Return())
3557df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart      .WillOnce(Throw(
3558df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart          DBus::Error(
3559df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3560df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3561df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_TRUE(TDLSTeardown(kPeer));
3562df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  EXPECT_FALSE(TDLSTeardown(kPeer));
3563df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3564df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart}
3565df4c7d65a47fb19f66105c91fa8a4a28522efc31Paul Stewart
3566c6fbad96f565fda1caae9cd80569314685c99b90Paul StewartTEST_F(WiFiMainTest, PerformTDLSOperation) {
3567c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  StartWiFi();
3568c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kPeer[] = "00:11:22:33:44:55";
3569c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3570c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3571c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3572c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation("Do the thing", kPeer, &error));
3573c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3574c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3575c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3576c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3577c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3578c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, "peer", &error));
3579c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // This is not a valid IP address nor is it a MAC address.
3580c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3581c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3582c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3583c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  const char kAddress[] = "192.168.1.1";
3584c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillRepeatedly(Return(device_info()));
3585c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3586c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3587c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // The provided IP address is not local.
3588c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3589c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(false));
3590c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3591c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3592c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3593c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ(Error::kInvalidArguments, error.type());
3594c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3595c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3596c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3597c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  {
3598c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // If the MAC address of the peer is in the ARP cache, we should
3599c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    // perform the TDLS operation on the resolved MAC.
3600c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const char kResolvedMac[] = "00:11:22:33:44:55";
3601c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    const ByteString kMacBytes(
3602c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        WiFiEndpoint::MakeHardwareAddressFromString(kResolvedMac));
3603c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), HasDirectConnectivityTo(kInterfaceIndex, _))
3604c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(Return(true));
3605c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*device_info(), GetMACAddressOfPeer(kInterfaceIndex, _, _))
3606c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart        .WillOnce(DoAll(SetArgumentPointee<2>(kMacBytes), Return(true)));
3607c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(),
3608c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                TDLSDiscover(StrEq(kResolvedMac)));
3609c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Error error;
3610c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation,
3611c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart                                       kAddress, &error));
3612c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3613c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(device_info());
3614c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3615c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart  }
3616c67f0bd13f10a41d032204bb8d2ee261098ca282Paul Stewart
3617c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // This is the same test as TDLSInterfaceFunctions above, but using the
3618c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  // method called by the RPC adapter.
3619c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSDiscover(StrEq(kPeer)))
3620c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3621c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3622c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3623c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3624c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3625c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3626c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3627c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3628c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3629c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3630c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3631c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3632c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSDiscoverOperation, kPeer, &error));
3633c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3634c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3635c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3636c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3637c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSSetup(StrEq(kPeer)))
3638c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3639c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3640c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3641c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3642c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3643c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3644c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3645c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3646c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3647c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3648c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3649c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3650c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSSetupOperation, kPeer, &error));
3651c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3652c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3653c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3654c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3655c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3656c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  const map<string, string> kTDLSStatusMap {
3657c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { "Baby, I don't care", kTDLSUnknownState },
3658c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateConnected, kTDLSConnectedState },
3659c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStateDisabled, kTDLSDisabledState },
3660c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerDoesNotExist, kTDLSNonexistentState },
3661c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    { WPASupplicant::kTDLSStatePeerNotConnected, kTDLSDisconnectedState },
3662c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  };
3663c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3664c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  for (const auto &it : kTDLSStatusMap) {
3665c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3666c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart        .WillOnce(Return(it.first));
3667c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3668c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(it.second,
3669c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3670c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3671c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3672c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3673c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3674c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSStatus(StrEq(kPeer)))
3675c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3676c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3677c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3678c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3679c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3680c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3681c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSStatusOperation, kPeer, &error));
3682c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3683c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3684c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
3685c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3686c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), TDLSTeardown(StrEq(kPeer)))
3687c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Return())
3688c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart      .WillOnce(Throw(
3689c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart          DBus::Error(
3690c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "fi.w1.wpa_supplicant1.UnknownError",
3691c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart              "test threw fi.w1.wpa_supplicant1.UnknownError")));
3692c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3693c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3694c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3695c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_TRUE(error.IsSuccess());
3696c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3697c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  {
3698c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    Error error;
3699c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ("", PerformTDLSOperation(kTDLSTeardownOperation, kPeer, &error));
3700c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart    EXPECT_EQ(Error::kOperationFailed, error.type());
3701c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart  }
3702c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart}
3703c6fbad96f565fda1caae9cd80569314685c99b90Paul Stewart
3704853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
3705