wifi_unittest.cc revision 0427cc1c28419b4980ecf4b1d8ba6c3e7bb341da
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 <netinet/ether.h>
8f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include <linux/if.h>
95c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <sys/socket.h>
105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include <linux/netlink.h>  // Needs typedefs from 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>
19a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include <base/stringprintf.h>
203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h>
214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov#include <base/string_split.h>
223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h>
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
241830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
257156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h>
262ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h>
27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
28853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
2926b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah#include "shill/geolocation_info.h"
318ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
33b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
34853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov#include "shill/mock_dbus_manager.h"
36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
37c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
38f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
39f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
40e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
413c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart#include "shill/mock_link_monitor.h"
42cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
432ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
443426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
4510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
465c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
47a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
48b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
50835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart#include "shill/mock_supplicant_network_proxy.h"
513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
525c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
533c5040174273386868cc8dea8044d22c465885d8Paul Stewart#include "shill/mock_wifi_provider.h"
547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
55dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
56853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
5885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart#include "shill/technology.h"
593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
603239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
61ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
62853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
63ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
640e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath;
65853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
66853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
703c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
72a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
73cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
75b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
76549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
78dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
79d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawalusing ::testing::NotNull;
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
81ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
82a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
83a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
84a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
878ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
88853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
89853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
92853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
943426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
953c5040174273386868cc8dea8044d22c465885d8Paul Stewart                         NULL, NULL, manager(), "wifi", "", 0)) {
96853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
98853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
1008abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
101853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
102853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
104de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
105de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
106853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
107853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
109a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
110a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1116bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
112de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
113a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
114a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
115a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
116a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
117a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
118a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1196bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1206bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1216bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1226bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
123a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
124853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
125a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
126a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1276bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1286bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1296bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1306bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
1319d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
132a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
133853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1344d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1366bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1400654ece95920696c530ce1c0344365eb741f7efePaul Stewart            WPASupplicant::kNetworkBgscanMethodSimple),
1414d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1424d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1434d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1444d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1454d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1466bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1474d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1484d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1494d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1504d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1514d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1524d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1534d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1544a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1550654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
1568abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
160e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
161e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
162e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1640654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
1658abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1668abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1676bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1688abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1698abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1708abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1710654ece95920696c530ce1c0344365eb741f7efePaul Stewart          WPASupplicant::kNetworkBgscanMethodLearn),
1728abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1730654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
174e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
175e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1760654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
1778abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1788abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
1798abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
180e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
181e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1848abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
1858abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1873c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
1883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
1893c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
1903c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
1913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
1923c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
1933c5040174273386868cc8dea8044d22c465885d8Paul Stewart
194e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
1953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
196e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiObjectTest(EventDispatcher *dispatcher)
197e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
1986c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(NULL),
199e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
200e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
201626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
202e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2033426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
204626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
205626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
206626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
207626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
2083c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
209dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
210b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
211b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
212f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
213d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart                                        kDeviceName)),
2142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov        dbus_manager_(new NiceMock<MockDBusManager>()),
2153c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
2163c5040174273386868cc8dea8044d22c465885d8Paul Stewart            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
2172f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal        proxy_factory_(this) {
2183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
219c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
220d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
221c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
222c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
223c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
224835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)).
225835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart        WillByDefault(InvokeWithoutArgs(
226835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart            this, &WiFiObjectTest::CreateSupplicantNetworkProxy));
227ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
2282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    manager_.dbus_manager_.reset(dbus_manager_);  // Transfers ownership.
2292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2315c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2345c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2353ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2363ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
237d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
238ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2395c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2405c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
2413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
2422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
243b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2445c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2455c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2465c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
2473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
2483c5040174273386868cc8dea8044d22c465885d8Paul Stewart       .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
2499a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
250b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
251b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
252b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
253ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2579a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2585c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
2593ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
2603ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
261d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
262f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
263f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
264549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
265549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
266549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
267549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
268549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
269c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
270c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
271c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
272c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
273c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
2743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
2767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
279e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    explicit TestProxyFactory(WiFiObjectTest *test);
2803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
2821830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
283dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
2843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
287196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart        SupplicantEventDelegateInterface */*delegate*/,
2881830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
2891830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
290dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
2913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
293b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
294b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
295b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
296b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
297b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
298b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
299835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    MOCK_METHOD2(CreateSupplicantNetworkProxy,
300835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                 SupplicantNetworkProxyInterface *(
301835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const DBus::Path &object_path,
302835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const char *dbus_addr));
303835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
3043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
305b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
306b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
307b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
308b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
309b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
310b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
311b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
312e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    WiFiObjectTest *test_;
3133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
3143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Simulate the course of events when the last enpoint of a service is
3163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
3173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
3183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    public:
3193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
3203c5040174273386868cc8dea8044d22c465885d8Paul Stewart          : wifi_(wifi), service_(service) {}
3213c5040174273386868cc8dea8044d22c465885d8Paul Stewart      virtual ~EndpointRemovalHandler() {}
3223c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3233c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr OnEndpointRemoved(
3243c5040174273386868cc8dea8044d22c465885d8Paul Stewart          const WiFiEndpointConstRefPtr &endpoint) {
3253c5040174273386868cc8dea8044d22c465885d8Paul Stewart        wifi_->DisassociateFromService(service_);
3263c5040174273386868cc8dea8044d22c465885d8Paul Stewart        return service_;
3273c5040174273386868cc8dea8044d22c465885d8Paul Stewart      }
3283c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3293c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
3303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
3313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
3323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
3333c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
3353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr &service) {
3363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
3373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
338b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
339b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
340b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
3413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
3423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
3433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
3443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
3453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
3463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
3473c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
3483c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
3493c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
3503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
3513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
3523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *ssid = base::StringPrintf("ssid%d", bss_counter_);
3533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
3543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *path = base::StringPrintf("/interface/bss%d", bss_counter_);
3553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_);
3563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
3573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
3583c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
3593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
3603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
3623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
3633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
3653c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
3663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
3673c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
3683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
3703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
3713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
3723c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
3733c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
3743c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
3753c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
3763c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
3773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
3783c5040174273386868cc8dea8044d22c465885d8Paul Stewart        flimflam::kModeManaged,
3793c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
3803c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
3813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
3833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
3843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
3863c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         uint16 frequency,
3873c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
3883c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
3893c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
3903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
3913c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
3923c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
3933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
3943c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
3953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
3963c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
3973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
3983c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
3993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
4003c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
4023c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
4033c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4053c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4063c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4073c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
4103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
4113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
4123c5040174273386868cc8dea8044d22c465885d8Paul Stewart      uint16 frequency,
4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
4163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4173c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4193c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
4203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
4213c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
4223c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4233c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4243c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4253c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    map<string, ::DBus::Variant> params;
4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->ConnectTo(service, params);
4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!network_path.empty()) {
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillOnce(Return(network_path));
4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
4840654ece95920696c530ce1c0344365eb741f7efePaul Stewart    ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
4883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
4891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
490b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
491b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
492b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
493c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  void TriggerScan() {
494c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley    wifi_->Scan(NULL);
495c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
4961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
4971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
4981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
499bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
500bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
501bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
5023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
503165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
5043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
5061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
5071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
5092b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
5102b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
5111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
512446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
513446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
5141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
5151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
5161aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
517b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
518b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
519b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
5203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
521e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
5223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
5233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
5243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
5253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
5278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
5288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
5293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
5363c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
5373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
538835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() {
539835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return new NiceMock<MockSupplicantNetworkProxy>();
540835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
5417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
5427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
5437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
544835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
545835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
546835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
5470427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
5480427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart    wifi_->NotifyEndpointChanged(endpoint);
5490427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  }
550381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
551381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
552381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
553261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
5543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
5553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
5563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
5573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
558e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
5593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
560c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
56179d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
562c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
563f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
564f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
565f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
5663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
567dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
5683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
5701590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
5711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
5737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
5747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
5755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
5765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
5775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
578cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
579cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    wifi_->pending_service_ = service;
580cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
581b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void SetScanInterval(uint16_t interval_seconds) {
582b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetScanInterval(interval_seconds, NULL);
583b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
584e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
585e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
586e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
5872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
5882b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
589b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
5903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
5922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
5932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
5942f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
5952f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
5962f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
5972f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
5982f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
5992f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
6002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
6012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantAppear(":1.7");
6022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
6032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
6052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantVanish();
6062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
6072b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
6092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
6102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
6124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
6134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
6144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
6154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        flimflam::kBgscanMethodProperty,
6164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
6174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
6184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
6194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
6204a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
6214a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
6224a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
6234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
6244a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
625bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
626bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
627bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
62810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
629db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
630db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
631db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
632db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
633e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
634e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
635e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
636e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
6371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
6391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
6401aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
6411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
6421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
6431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
6441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
6453c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
6463c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
6473c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
6483c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
6491369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  bool SuspectCredentials(const WiFiService &service,
6501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
6511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
6521369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
6531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
6543c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
6553c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
6563c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
6573c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
65810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
65910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
66010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
66110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
66285aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
66385aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
66485aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
66585aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
6663239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
6673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
6683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
669d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
670d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
671d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
672d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
673d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
674d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
675d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
676d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
677d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
6783239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
6793239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
6803239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
6813239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
682b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
683b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
684b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
685b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
6863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
6873c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
6883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
6893c5040174273386868cc8dea8044d22c465885d8Paul Stewart
690e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
6915c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
6925c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
6933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
695dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
6963426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
697f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
6982ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
699c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
7003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
7013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
7023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
7033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
7053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
7063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
7073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
708626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
7093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
7103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
711446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
712446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
7133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
714dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
715b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
716f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
717f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
7182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  NiceMock<MockDBusManager> *dbus_manager_;
7193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
7213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
722835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  NiceMock<TestProxyFactory> proxy_factory_;
7233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
7243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
725e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
726e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
727e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
728e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
729446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
730446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
7313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
732e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
733b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
734261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
735261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
736e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
7373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
7383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
7393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
740e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
7413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
7423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
7433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
7453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
7463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
7473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
7493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
7503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
7513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
7523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
7533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
7553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
7563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7570654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertySignal].writer().
758e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
7590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
760e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
7610654ece95920696c530ce1c0344365eb741f7efePaul Stewart  bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
762b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
7633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
765e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
766b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
767b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
768b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
769b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
770b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
771b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
772b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
773e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
774e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
775e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
776e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
777e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
778e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
779e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
780e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
781e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
7823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
7833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
7843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
7853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
7873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
7883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
7893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7912b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
7922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
7932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
7942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
7952b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
7962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
7972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
7980654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _));
7992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
8002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
8032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
8049cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
8059cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
8069cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
8079cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
8089cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
8099cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
8102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8122b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
8132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8142b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8152b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
8162b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8179cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
8189cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
8199cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
8209cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
8219cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
8222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8242b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
8252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
8282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
8292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
8302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8312b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
8322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
8332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
8342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8362b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
8372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
8382b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
8392b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
8402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
8412b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8422b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
843549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
8443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
8453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
8463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
8473c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
848549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
849549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
850c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
851549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
852549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
853549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
8553c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
8563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
8573c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
8583c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
8593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
860549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
861549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
862549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
863549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
864549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
8653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
8663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
8683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
8693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
8703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
8713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
8723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
873b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
8743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
8753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
8763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
877b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
8783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
880835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
8813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
882835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
8833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
8843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
885835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
886835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
887835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
8880427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul StewartTEST_F(WiFiMainTest, NotifyEndpointChanged) {
8890427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  WiFiEndpointRefPtr endpoint =
8900427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart      MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
8910427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
8920427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart  NotifyEndpointChanged(endpoint);
8930427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart}
8940427cc1c28419b4980ecf4b1d8ba6c3e7bb341daPaul Stewart
895381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
896381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
897381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
8983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
899381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
900381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
901381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
902381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
903381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
9043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
905381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
906381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
907381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
908381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
909381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
910381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
911381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
912381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
913ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
914ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
915ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
916ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
917ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
918ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
919381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
920381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
9213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
922381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
923381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
924381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
925381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
926381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
927381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
928381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
929381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
930381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
931381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
9323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
933381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
934381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
935381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
936381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
937381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
938381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
939381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
940381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
9413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
9423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
9433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
9443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
9453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
9463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
9472b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
9483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
9493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
9503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9513239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
9523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
9553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
9563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
9573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
960c68c867905c985c0a703a7e2b575ecc091d14688Christopher WileyTEST_F(WiFiMainTest, NoScansWhileConnecting) {
961c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  StartWiFi();
9623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
9633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
9643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
966c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(service);
967c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // If we're connecting, we ignore scan requests to stay on channel.
9683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
969c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
970c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
971c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
972c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
9743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
975c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
976c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
977c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
978c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
980c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
981c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(NULL);
982c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
9833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
984c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
985c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
986c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
987c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
989c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
9903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
991c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
992c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
993c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
994c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
996c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
997c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
9982f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1000ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1001ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
10023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
10035c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
1004ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1005ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
10062f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1007ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1008ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1009ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
10102f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
10113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1012ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1013ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
10143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1015ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1016ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
10172f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1018ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1019ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1020ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
10212f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
10223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1023ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1024ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
10253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
10263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
10273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
10283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
10293ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
10303ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
1031ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
10322f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1033ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1034ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1035ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
10363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
10373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
10383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1039e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
10403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1041e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
10423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1043e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
10443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1045e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1046e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
1047e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1048e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1049e41a72d0737488d561a4158019409d5785dad61bThieu Le
1050e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1051e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1052e41a72d0737488d561a4158019409d5785dad61bThieu Le
1053e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1054e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1055e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1056e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1057e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1058e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1059e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1060e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1061e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1062e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1063e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1064e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
10653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
10683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
10703c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
10713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
10723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
10733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
10743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
10753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
10763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
10773c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
10783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
10793c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
10803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
10813c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
10823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
10833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
10843c5040174273386868cc8dea8044d22c465885d8Paul Stewart
10853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1086b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1087e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
1088e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1089b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1090e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1091e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
10928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
10938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
10948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
10958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
10963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
10973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
10983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
10993c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
11003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
11013c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
11023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
11033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
11043c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
11058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1107261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1108261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1109261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1110261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
11113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
11123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
11133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
11143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
11153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
11163c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
11173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
11183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
11193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1121835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1122835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
11233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
11243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1125835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1126835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
11273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1128835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
11293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11303c5040174273386868cc8dea8044d22c465885d8Paul Stewart
11313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
11320654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1133835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1134835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1135835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // with this service.
11363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
11373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1138835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1139835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1140835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
11410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
11420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
11433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
11443c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
11453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
11463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
11480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
11493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
11500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
11510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
11520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
11540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
11553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
11563c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
11573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
11583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
11590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
11613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
11623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
11633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
11643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
11653c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService("/new/path", NULL, NULL));
11663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
11690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
11703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
11713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
11733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
11740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
11760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
11770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
11780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
11793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
11802b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
11810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
11820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
11843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
11853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
11863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
11873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
11890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
11910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
11920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1193835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1194835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1195835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy();
1196835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy(
11970654ece95920696c530ce1c0344365eb741f7efePaul Stewart      kPath, WPASupplicant::kDBusAddr))
1198835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart      .WillOnce(Return(network_proxy));
1199835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
12003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
12010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
12023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
12033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
12040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1206c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
12073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
12093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
12103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1211c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
12123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1213c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1214c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1215c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1216c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
1217c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, GetCurrentService().get());
1218c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, wifi()->selected_service().get());
1219c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1220c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
12210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
12220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
12233c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL));
12243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL));
12250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
12260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
12273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
12280ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
12290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
12310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
12322b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
12332b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
12342b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
12352b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul StewartTEST_F(WiFiMainTest, TimeoutPendingService) {
12362b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
12372b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
12382b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
12393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
12403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
12412b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
12422b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
12433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
12443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
12450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
12480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
12493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
12503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
12513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
12520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
12530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
12563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
12583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
12593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
12600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
12610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
12620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
12630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
12650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
12663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
12670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12695c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1270c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
12713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
12723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
12733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
12743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
12753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
12763c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
12783c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
12803c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
12813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1282c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1283b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1284c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
12855c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
12865c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1287549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
12883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
12903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
12913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
12923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
12933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
12943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
12953c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
12963c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
12973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1298549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
1299549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1300549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1301549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
1302446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
13033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
13043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
13053c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
13063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
13071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
13080654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
13091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
13100654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
13111aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
13120654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
13131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1314446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
13151aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
13160654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
13171aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
13183c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
13191aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
13203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13211aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1322446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
1323446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
1324cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
1325ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
1326a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
13270654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
1328ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1329ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1330ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1331ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1332ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1333ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1334ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1335ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1336ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1337ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1338ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
13393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
13403c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13423c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER(HasNoHiddenSSID, "") {
13433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
13440654ece95920696c530ce1c0344365eb741f7efePaul Stewart      arg.find(WPASupplicant::kPropertyScanSSIDs);
13453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
1346ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1347ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1348ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
13493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
13503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
13513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
13523c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
13543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
13553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
13563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
13573c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
13583c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13593c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiMainTest, ScanNoHidden) {
1360ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
13613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
13623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
13633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID()));
1364ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1365ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1366ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1367fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1368fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
1369fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1370fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
1371fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
13723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1373fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
1374fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
1375fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
1376fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
1377fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
1378fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
1379fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
13807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
13817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
13827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
13857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
13860654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
13870654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
13887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
13917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
13927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1394cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
13957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
13970654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
13987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
13997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1401d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
14027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
14047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
14057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
14067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1407d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1408d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
14097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
14107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1411cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
14122b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1413d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
14147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
14150654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
14160654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
14170654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
14187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
14197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
14207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
14237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1425a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
1426a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1427a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1428a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1429a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1430a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
1431a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
1432a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1433a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
1434a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1435a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1436a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1437a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
1438a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
1439a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
1440a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1441a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1442a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1443a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1444a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1445a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1446a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
14470654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
14480654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
1449a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
1450a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1451a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
1452a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1453a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
1454a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1455a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetPendingService(NULL);
1456a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
1457a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1458a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
1459a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // level of supplciant debugging.
1460a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
14610654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
14620654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
1463a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
14640654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1465a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1466a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
14671590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
14681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
14693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
14703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
14713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL);
14721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle));
14743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown));
14750654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
14761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
14771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14801590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
14811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
14823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
14833c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
14843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
14853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
14863c5040174273386868cc8dea8044d22c465885d8Paul Stewart      0, 0, kNetworkModeAdHoc, NULL, &service1));
14873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
14881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1489c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1490c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1491c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1492c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
14933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
14943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
14953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
14960654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
14973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
14983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
14993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
15001590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1502e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1503e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
15043c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
15053c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
15063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
15073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
15083c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
15093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
15103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
15114eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
15124eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
15138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
15148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
15163c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
15188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
15203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15213c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
15223c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
15238a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15248a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15258a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
15268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
15283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15308a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
15318a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15334a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
15340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
15350654ece95920696c530ce1c0344365eb741f7efePaul Stewart      ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
15364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
15394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
15403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
15413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
15423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
15430654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
15444d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
15454d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15464d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15474a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
15484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
15493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
15503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
15524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
15534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
15544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
15554a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
15564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
15573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
15584a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15594a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
15604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
15613c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
15623c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15633c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15640654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
15654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
15664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
15684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
15693c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
15703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
15734a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
15744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
15750654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
15764a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
15774a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
15784a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
15794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
15804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
15814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
15824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
15834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
15844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
15860654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
15874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
15883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
15893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15914a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
15924a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
15934a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
15940654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
15954a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
15964a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
15974a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
15984a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
15994a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
16004a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
16014a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
16025c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
16035c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
16040654ece95920696c530ce1c0344365eb741f7efePaul Stewart    EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
16055c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
16063c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
16075c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
16083c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
16095c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
16105c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
16115c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
16120654ece95920696c530ce1c0344365eb741f7efePaul Stewart                                  WPASupplicant::kNetworkPropertyBgscan,
16135c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
16145c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
16154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
16164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1617c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1618c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
16193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16203c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
1621c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1622c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1623c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1624c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1625c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1626c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1627c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1628c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1629c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1630c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1631c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
16323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
16348f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
1635c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
16368f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
16378f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
16380654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
16395519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
16403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
16423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
16438f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
16448f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
16455519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
16465519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
16473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
16493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
16500654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
1651c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1652c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1653b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1654b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1655b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
1656b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
1657b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1658b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1659b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1660b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1661b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1662b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1663b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1664b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1665b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
1666b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
1667b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1668b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
1669b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
16703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
16713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
16723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
16733c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
16743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1675b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
1676b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
1677b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
1678b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1679b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
16805c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
16815c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
16825c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
16835c05b2920be742d518829972127172481722058dmukesh agrawal
16845c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
16855c05b2920be742d518829972127172481722058dmukesh agrawal
16865c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
16875c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
16885c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
16893c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
16905c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
16912f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
16925c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
16935c05b2920be742d518829972127172481722058dmukesh agrawal}
16945c05b2920be742d518829972127172481722058dmukesh agrawal
1695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerIdle) {
1696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1699b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1703b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
1709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1713b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1714b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
1715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
1716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
1723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
17263c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL);
1727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1729b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1734b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
1737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(1);
1742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1745b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1746b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1750b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1753b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1754b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1755b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1756b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1757b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1758b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(0);
1759b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1760b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1761b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1762b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
17663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
17683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
17693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
17713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
17720654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1773b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1774b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1775b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1776b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1777b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1778b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
1780b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17823c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
17830654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1786b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
17873c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
17883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  StartWiFi();
17893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
17903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
17913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
17923c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
17933c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
17943c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
17953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
17963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
17973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
17983c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
17993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
18003c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
18013c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Called Reassociate()."))).Times(1);
18023c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
18033c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
18043c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnSupplicantVanish();
18053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
18063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
18073c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
18083c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Cannot reassociate."))).Times(1);
18093c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
18103c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
18113c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
1812cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
18133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
18140654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
1815cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
18161369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
1817cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1818cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1819cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
18203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
18210654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
1822cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
18231369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
18241369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
18251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
1826cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1827cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1828cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
18293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
18300654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
1831cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  service->has_ever_connected_ = true;
18321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
1833cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1834cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
18351369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
18363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
18371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
18381369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = false;
18391369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18400654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusStarted, "");
18411369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = true;
18421369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18431369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = false;
18441369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
18451369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
18461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
18470654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusCompletion,
18480654ece95920696c530ce1c0344365eb741f7efePaul Stewart                 WPASupplicant::kEAPParameterSuccess);
18491369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18501369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
18511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18521369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
18531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ScopedMockLog log;
1854cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1855cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
18560654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
1857cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
1858cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1859f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
186056e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
186156e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetState(_)).Times(0);
1862cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
18631369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
18641369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(flimflam::kErrorBadPassphrase)));
18650654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
18661369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
18671369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18681369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
18691369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ScopedMockLog log;
18701369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
18711369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
18720654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusStarted, "");
18731369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(service->has_ever_connected());
18741369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18751369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
18761369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
18771369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(0);
18781369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
18791369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
18801369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(shill::kErrorEapAuthenticationFailed)));
18810654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
1882cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1883cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1884e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
1885e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
18861aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
1887e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
18881aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
1889e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1890e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1891e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
1892e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1893e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
1894e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1895e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
18961aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
1897e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
1898e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
1899e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
1900e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1901e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
1902e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
1903e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
1904e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
1905e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
1906e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
1907e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
1908e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
1909e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
1910e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
1911e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1912e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
1913e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
1914e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1915e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1916e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
1917e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1918e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
1919e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
1920e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1921e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1922e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
1923e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
1924e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
1925e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
1926e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
1927e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
19281aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
1929e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
1930e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
1931e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
1932e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1933e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
1934e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
1935e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
1936e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1937e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
1938e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1939e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
1940e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1941e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
1942e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
1943e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
1944e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1945e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
1946e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
1947e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
19481aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
19491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
19501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
19513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
19523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
19531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19541aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19551aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19561aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
19571aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19581aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19591aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
19601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
19631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19651aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
19661aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19671aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19681aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
19691aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19701aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19711aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19721aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19731aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
19741aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19751aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
19761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
1977bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
1978bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
1979bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
1980bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1981bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
1982bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
1983bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
1984bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1985bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1986bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1987bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
1988bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
1989bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1990bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1991bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1992bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
19930654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
1994bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1995bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
1996bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
1997bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1998bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1999bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2000bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
20010654ece95920696c530ce1c0344365eb741f7efePaul Stewart  args[WPASupplicant::kInterfacePropertySubject].writer()
2002bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
2003bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2004bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2005db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
2006db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2007db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
2008db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2009db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2010db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2011db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
2012db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2013db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(string(), string());
2014db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2015db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2016db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
2017db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  const string kEAPMethod("EAP-ROCHAMBEAU");
2018db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2019db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                       EndsWith("accepted EAP method " + kEAPMethod)));
20200654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusAcceptProposedMethod, kEAPMethod);
2021db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2022db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith("Completed authentication."))).Times(1);
20230654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusCompletion,
20240654ece95920696c530ce1c0344365eb741f7efePaul Stewart                 WPASupplicant::kEAPParameterSuccess);
2025db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2026db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2027db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2028db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2029db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  // An EAP failure without a previous TLS indication yields a generic failure.
2030db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2031d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawal  EXPECT_CALL(*service, DisconnectWithFailure(
2032d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawal      Service::kFailureEAPAuthentication, NotNull()))
20333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
20340654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusCompletion,
20350654ece95920696c530ce1c0344365eb741f7efePaul Stewart                 WPASupplicant::kEAPParameterFailure);
2036db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2037db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2038db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  // An EAP failure with a previous TLS indication yields a specific failure.
2039db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
2041db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
20420654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusLocalTLSAlert, string());
2043db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service,
2045d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawal              DisconnectWithFailure(Service::kFailureEAPLocalTLS, NotNull()))
20463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
20470654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusCompletion,
20480654ece95920696c530ce1c0344365eb741f7efePaul Stewart                 WPASupplicant::kEAPParameterFailure);
2049db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2050db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2051db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
20523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
2053db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
20540654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusRemoteTLSAlert, string());
2055db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
20563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service,
2057d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawal              DisconnectWithFailure(Service::kFailureEAPRemoteTLS, NotNull()))
20583c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
20590654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusCompletion,
20600654ece95920696c530ce1c0344365eb741f7efePaul Stewart                 WPASupplicant::kEAPParameterFailure);
2061db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2062db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2063db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
20643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
2065db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2066db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  const string kStrangeParameter("ennui");
2067db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,EndsWith(
2068db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart      string("Unexpected ") +
20690654ece95920696c530ce1c0344365eb741f7efePaul Stewart      WPASupplicant::kEAPStatusRemoteCertificateVerification +
2070db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart      " parameter: " + kStrangeParameter)));
20710654ece95920696c530ce1c0344365eb741f7efePaul Stewart  ReportEAPEvent(WPASupplicant::kEAPStatusRemoteCertificateVerification,
2072db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 kStrangeParameter);
2073bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
2074bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2075c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2076c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
2077c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
2078c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
2079c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
2080c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
2081c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2082c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
2083c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
2084c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
2085c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
2086c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
208760ceaf336297ce536201a82e350c697f1a5b546dDarin PetkovTEST_F(WiFiMainTest, VerifyPaths) {
2088196f50fdcc687512c123a34f54a21eea8215708fPaul Stewart  string path(WPASupplicant::kSupplicantConfPath);
208960ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  TrimString(path, FilePath::kSeparators, &path);
209060ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
209160ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov}
209260ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov
20936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
20946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
20956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
20966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
20976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
20986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  uint16 frequency;
20996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
21006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
21016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
21036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
21046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
21056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
21066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
21076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
21086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
21096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
21106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
21116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
21126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
21136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
21146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
21156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
21176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
21186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
21196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
21206d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
21216d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21226d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
21236d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
21246d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
21256d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
21266d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
21276d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
21286d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
21296d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
21306d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
21316d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21325581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
21335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
21345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
21365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
21375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
21385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
21425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
21435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21440654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
21455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
21475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
21505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
21515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21520654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
21530654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelError))
21540654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
21550654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
21560654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
21570654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
21580654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
21590654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
21605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
21725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
21735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21740654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
21750654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
21765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
21775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
21815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
21825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21830654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
21840654ece95920696c530ce1c0344365eb741f7efePaul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
21855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
21865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
21905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
21915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21920654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
21930654ece95920696c530ce1c0344365eb741f7efePaul Stewart      .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
21945581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21955581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21965581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21975581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21985581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
21995581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
22005581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
22015581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
22025581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
22035581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
22045581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
22055581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
220650cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
220750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
220850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
220950cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
221050cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
2211853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
2212