wifi_unittest.cc revision 3c5040174273386868cc8dea8044d22c465885d8
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
64853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
65853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
66853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
693c5040174273386868cc8dea8044d22c465885d8Paul Stewartusing ::testing::AtLeast;
703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
71a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
72cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
74b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
75549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewartusing ::testing::InvokeWithoutArgs;
767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
77dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
79ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
80a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
81a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
82a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
858ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
86853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
87853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
88853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
923426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
933c5040174273386868cc8dea8044d22c465885d8Paul Stewart                         NULL, NULL, manager(), "wifi", "", 0)) {
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
96853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
97853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
988abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
102de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
103de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
104853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
105853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1066bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
107a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
108a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1096bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
110de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
111a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
112a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
113a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
114a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
115a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
116a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1176bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1186bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1196bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1206bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
121a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
122853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
123a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
124a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1256bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1266bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1276bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1286bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
1299d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
130a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
131853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1346bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal            wpa_supplicant::kNetworkBgscanMethodSimple),
1394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1404d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1414d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1424d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1434d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1446bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1454d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1464d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1474d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1484d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1494d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1504d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1514d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1524a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiPropertyTest, BgscanMethodProperty) {
1538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
1548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1574a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  string method;
158e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  Error unused_error;
159e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
160e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodSimple, method);
1638abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1648abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1656bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1668abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1678abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1688abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1698abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal          wpa_supplicant::kNetworkBgscanMethodLearn),
1708abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1718abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
172e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
173e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, method);
1758abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1768abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
1778abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
178e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart  EXPECT_TRUE(device_->store().GetStringProperty(
179e6e8e499adf14d9408a7e07f54b58d71ab3a9502Paul Stewart      flimflam::kBgscanMethodProperty, &method, &unused_error));
1804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
1814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(device_->bgscan_method_.empty());
1828abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
1838abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1843c5040174273386868cc8dea8044d22c465885d8Paul Stewart
1853c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER_P(EndpointMatch, endpoint, "") {
1863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return
1873c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->ssid() == endpoint->ssid() &&
1883c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->network_mode() == endpoint->network_mode() &&
1893c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg->security_mode() == endpoint->security_mode();
1903c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
1913c5040174273386868cc8dea8044d22c465885d8Paul Stewart
192e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
1933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
194e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiObjectTest(EventDispatcher *dispatcher)
195e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
1966c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(NULL),
197e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
198e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
199626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
200e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
2013426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
202626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
203626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
204626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
205626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
2063c5040174273386868cc8dea8044d22c465885d8Paul Stewart        bss_counter_(0),
207dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
208b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
209b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
210f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
211d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart                                        kDeviceName)),
2122b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov        dbus_manager_(new NiceMock<MockDBusManager>()),
2133c5040174273386868cc8dea8044d22c465885d8Paul Stewart        supplicant_interface_proxy_(
2143c5040174273386868cc8dea8044d22c465885d8Paul Stewart            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
2152f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal        proxy_factory_(this) {
2163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
217c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
218d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
219c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
220c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
221c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
222835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)).
223835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart        WillByDefault(InvokeWithoutArgs(
224835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart            this, &WiFiObjectTest::CreateSupplicantNetworkProxy));
225ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
2262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    manager_.dbus_manager_.reset(dbus_manager_);  // Transfers ownership.
2272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
2283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->provider_ = &wifi_provider_;
2295c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
2303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2315c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2325c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2333ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2343ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
235d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(3);
236ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2375c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2385c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
2393c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
2402b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
241b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2425c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2435c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2445c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
2453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
2463c5040174273386868cc8dea8044d22c465885d8Paul Stewart       .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
2479a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
248b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
249b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
250b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
251ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2559a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2565c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
2573ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
2583ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
259d34a47c06c38f2594c85b14b0f9cee2bf37c0e84Christopher Wiley    ScopeLogger::GetInstance()->set_verbose_level(0);
260f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
261f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
262549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  // Needs to be public since it is called via Invoke().
263549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  void StopWiFi() {
264549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
265549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  }
266549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
267c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // Needs to be public since it is called via Invoke().
268c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  void ThrowDBusError() {
269c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley    throw DBus::Error("SomeDBusType", "A handy message");
270c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  }
271c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
2723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
2747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
2763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
277e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    explicit TestProxyFactory(WiFiObjectTest *test);
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
2801830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
281dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
2823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
2851830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const WiFiRefPtr &/*wifi*/,
2861830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
2871830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
288dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
291b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
292b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
293b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
294b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
295b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
296b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
297835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    MOCK_METHOD2(CreateSupplicantNetworkProxy,
298835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                 SupplicantNetworkProxyInterface *(
299835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const DBus::Path &object_path,
300835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart                     const char *dbus_addr));
301835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
303b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
304b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
305b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
306b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
307b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
308b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
309b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
310e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    WiFiObjectTest *test_;
3113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
3123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Simulate the course of events when the last enpoint of a service is
3143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // removed.
3153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  class EndpointRemovalHandler {
3163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    public:
3173c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
3183c5040174273386868cc8dea8044d22c465885d8Paul Stewart          : wifi_(wifi), service_(service) {}
3193c5040174273386868cc8dea8044d22c465885d8Paul Stewart      virtual ~EndpointRemovalHandler() {}
3203c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3213c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr OnEndpointRemoved(
3223c5040174273386868cc8dea8044d22c465885d8Paul Stewart          const WiFiEndpointConstRefPtr &endpoint) {
3233c5040174273386868cc8dea8044d22c465885d8Paul Stewart        wifi_->DisassociateFromService(service_);
3243c5040174273386868cc8dea8044d22c465885d8Paul Stewart        return service_;
3253c5040174273386868cc8dea8044d22c465885d8Paul Stewart      }
3263c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3273c5040174273386868cc8dea8044d22c465885d8Paul Stewart   private:
3283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiRefPtr wifi_;
3293c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiServiceRefPtr service_;
3303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  };
3313c5040174273386868cc8dea8044d22c465885d8Paul Stewart
3323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EndpointRemovalHandler *MakeEndpointRemovalHandler(
3333c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr &service) {
3343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new EndpointRemovalHandler(wifi_, service);
3353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
336b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
337b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
338b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
3393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function creates a new endpoint with a mode set to |mode|.  We
3403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // synthesize new |path| and |bssid| values, since we don't really care
3413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // what they are for unit tests.  If "use_ssid" is true, we used the
3423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // passed-in ssid, otherwise we create a synthesized value for it as well.
3433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
3443c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     bool use_ssid,
3453c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *ssid,
3463c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *path,
3473c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                     string *bssid) {
3483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    bss_counter_++;
3493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!use_ssid) {
3503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *ssid = base::StringPrintf("ssid%d", bss_counter_);
3513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
3523c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *path = base::StringPrintf("/interface/bss%d", bss_counter_);
3533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_);
3543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
3553c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_,
3563c5040174273386868cc8dea8044d22c465885d8Paul Stewart                OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
3573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return endpoint;
3583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
3603c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
3613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr MakeEndpointWithMode(
3633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const string &ssid, const string &bssid, const string &mode) {
3643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return WiFiEndpoint::MakeOpenEndpoint(
3653c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
3663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockServiceWithSSID(
3683c5040174273386868cc8dea8044d22c465885d8Paul Stewart      vector<uint8_t> ssid, const std::string &security) {
3693c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return new NiceMock<MockWiFiService>(
3703c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &control_interface_,
3713c5040174273386868cc8dea8044d22c465885d8Paul Stewart        event_dispatcher_,
3723c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &metrics_,
3733c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &manager_,
3743c5040174273386868cc8dea8044d22c465885d8Paul Stewart        &wifi_provider_,
3753c5040174273386868cc8dea8044d22c465885d8Paul Stewart        ssid,
3763c5040174273386868cc8dea8044d22c465885d8Paul Stewart        flimflam::kModeManaged,
3773c5040174273386868cc8dea8044d22c465885d8Paul Stewart        security,
3783c5040174273386868cc8dea8044d22c465885d8Paul Stewart        false);
3793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
3813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
3823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
3833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
3843c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         uint16 frequency,
3853c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         const char *mode,
3863c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         WiFiEndpointRefPtr *endpoint_ptr,
3873c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                         MockWiFiServiceRefPtr *service_ptr) {
3883c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid;
3893c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
3903c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
3913c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
3923c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
3933c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
3943c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
3953c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
3963c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
3973c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
3983c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
3993c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (service_ptr) {
4003c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *service_ptr = service;
4013c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4023c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4033c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4043c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4053c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path AddEndpointToService(
4083c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiServiceRefPtr service,
4093c5040174273386868cc8dea8044d22c465885d8Paul Stewart      int16_t signal_strength,
4103c5040174273386868cc8dea8044d22c465885d8Paul Stewart      uint16 frequency,
4113c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const char *mode,
4123c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr) {
4133c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string ssid(service->ssid().begin(), service->ssid().end());
4143c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path path;
4153c5040174273386868cc8dea8044d22c465885d8Paul Stewart    string bssid;
4163c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint =
4173c5040174273386868cc8dea8044d22c465885d8Paul Stewart        MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
4183c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
4193c5040174273386868cc8dea8044d22c465885d8Paul Stewart        .WillRepeatedly(Return(service));
4203c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
4213c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4223c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4233c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4243c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return path;
4253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4263c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateConnect(WiFiServiceRefPtr service) {
4273c5040174273386868cc8dea8044d22c465885d8Paul Stewart    map<string, ::DBus::Variant> params;
4283c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->ConnectTo(service, params);
4293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  void InitiateDisconnect(WiFiServiceRefPtr service) {
4313c5040174273386868cc8dea8044d22c465885d8Paul Stewart    wifi_->DisconnectFrom(service);
4323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectingService(
4343c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
4353c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
4363c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
4373c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (!network_path.empty()) {
4383c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
4393c5040174273386868cc8dea8044d22c465885d8Paul Stewart          .WillOnce(Return(network_path));
4403c5040174273386868cc8dea8044d22c465885d8Paul Stewart      EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
4413c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4423c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4433c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service;
4443c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
4453c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path(MakeNewEndpointAndService(
4463c5040174273386868cc8dea8044d22c465885d8Paul Stewart        0, 0, kNetworkModeAdHoc, &endpoint, &service));
4473c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateAssociating));
4483c5040174273386868cc8dea8044d22c465885d8Paul Stewart    InitiateConnect(service);
4493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_FALSE(GetPendingTimeout().IsCancelled());
4513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4533c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4543c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
4553c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
4563c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
4583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
4593c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr SetupConnectedService(
4613c5040174273386868cc8dea8044d22c465885d8Paul Stewart      const DBus::Path &network_path,
4623c5040174273386868cc8dea8044d22c465885d8Paul Stewart      WiFiEndpointRefPtr *endpoint_ptr,
4633c5040174273386868cc8dea8044d22c465885d8Paul Stewart      ::DBus::Path *bss_path_ptr) {
4643c5040174273386868cc8dea8044d22c465885d8Paul Stewart    WiFiEndpointRefPtr endpoint;
4653c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ::DBus::Path bss_path;
4663c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockWiFiServiceRefPtr service =
4673c5040174273386868cc8dea8044d22c465885d8Paul Stewart        SetupConnectingService(network_path, &endpoint, &bss_path);
4683c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (endpoint_ptr) {
4693c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *endpoint_ptr = endpoint;
4703c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4713c5040174273386868cc8dea8044d22c465885d8Paul Stewart    if (bss_path_ptr) {
4723c5040174273386868cc8dea8044d22c465885d8Paul Stewart      *bss_path_ptr = bss_path;
4733c5040174273386868cc8dea8044d22c465885d8Paul Stewart    }
4743c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
4753c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportCurrentBSSChanged(bss_path);
4763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_TRUE(GetPendingTimeout().IsCancelled());
4773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4783c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4793c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
4803c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
4813c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
4823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
4833c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
4843c5040174273386868cc8dea8044d22c465885d8Paul Stewart
4853c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_EQ(service, GetCurrentService());
4863c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return service;
4871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
488b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
489b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
490b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
491c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  void TriggerScan() {
492c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley    wifi_->Scan(NULL);
493c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  }
4941590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
4951590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
4961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
497bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
498bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
499bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
5003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
501165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
5023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
5041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
5051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5062b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &GetPendingTimeout() {
5072b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart    return wifi_->pending_timeout_callback_;
5082b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  }
5091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  const base::CancelableClosure &GetReconnectTimeoutCallback() {
510446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart    return wifi_->reconnect_timeout_callback_;
511446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  }
5121aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  int GetReconnectTimeoutSeconds() {
5131aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    return WiFi::kReconnectTimeoutSeconds;
5141aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
515b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
516b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
517b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
5183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
519e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
5203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
5213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
5223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
5233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
5258a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
5268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
5273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // This function returns the supplicant interface proxy whether
5293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // or not we have passed the instantiated object to the WiFi instance
5303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // from WiFiObjectTest, so tests don't need to worry about when they
5313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // set expectations relative to StartWiFi().
5323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
5333c5040174273386868cc8dea8044d22c465885d8Paul Stewart    MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
5343c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return proxy ? proxy : supplicant_interface_proxy_.get();
5353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
536835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() {
537835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return new NiceMock<MockSupplicantNetworkProxy>();
538835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
5397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
5407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
5417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
542835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  void ClearCachedCredentials(const WiFiService *service) {
543835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart    return wifi_->ClearCachedCredentials(service);
544835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  }
545381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  bool RemoveNetwork(const ::DBus::Path &network) {
546381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan    return wifi_->RemoveNetwork(network);
547381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  }
548261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
5493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
5503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
5513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
5523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
553e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
5543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
555c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
55679d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
557c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
558f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
559f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
560f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
5613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
562dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
5633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
5651590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
5661590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
5677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
5687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
5697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
5705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  void ReportWiFiDebugScopeChanged(bool enabled) {
5715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart    wifi_->OnWiFiDebugScopeChanged(enabled);
5725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  }
573cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
574cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    wifi_->pending_service_ = service;
575cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
576b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void SetScanInterval(uint16_t interval_seconds) {
577b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetScanInterval(interval_seconds, NULL);
578b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
579e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
580e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
581e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
5822b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi(bool supplicant_present) {
5832b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->supplicant_present_ = supplicant_present;
584b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
5853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5862b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void StartWiFi() {
5872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    StartWiFi(true);
5882b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
5892f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnAfterResume() {
5902f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnAfterResume();
5912f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
5922f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  void OnBeforeSuspend() {
5932f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal    wifi_->OnBeforeSuspend();
5942f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  }
5952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantAppear() {
5962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantAppear(":1.7");
5972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_TRUE(wifi_->supplicant_present_);
5982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
5992b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  void OnSupplicantVanish() {
6002b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    wifi_->OnSupplicantVanish();
6012b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    EXPECT_FALSE(wifi_->supplicant_present_);
6022b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6032b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  bool GetSupplicantPresent() {
6042b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov    return wifi_->supplicant_present_;
6052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  }
6064a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  bool SetBgscanMethod(const string &method) {
6074a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ::DBus::Error error;
6084a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    return DBusAdaptor::SetProperty(
6094a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        wifi_->mutable_store(),
6104a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        flimflam::kBgscanMethodProperty,
6114a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusAdaptor::StringToVariant(method),
6124a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        &error);
6134a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
6144a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
6154a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  void AppendBgscan(WiFiService *service,
6164a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                    std::map<std::string, DBus::Variant> *service_params) {
6174a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    wifi_->AppendBgscan(service, service_params);
6184a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
6194a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
620bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
621bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
622bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
62310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
624db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  void ReportEAPEvent(const string &status, const string &parameter) {
625db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart    wifi_->EAPEventTask(status, parameter);
626db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  }
627db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
628e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
629e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
630e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
631e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
6321aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StartReconnectTimer() {
6331aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StartReconnectTimer();
6341aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
6351aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
6361aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  void StopReconnectTimer() {
6371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart    wifi_->StopReconnectTimer();
6381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  }
6391aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
6403c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void SetLinkMonitor(LinkMonitor *link_monitor) {
6413c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->set_link_monitor(link_monitor);
6423c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
6433c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
6441369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  bool SuspectCredentials(const WiFiService &service,
6451369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                          Service::ConnectFailure *failure) {
6461369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart    return wifi_->SuspectCredentials(service, failure);
6471369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  }
6481369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
6493c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  void OnLinkMonitorFailure() {
6503c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart    wifi_->OnLinkMonitorFailure();
6513c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  }
6523c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
65310ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
65410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
65510ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
65610ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
65785aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  MockMetrics *metrics() {
65885aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart    return &metrics_;
65985aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart  }
66085aea151c69ff40967becfa8751d821feebf3bb9Paul Stewart
6613239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
6623239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
6633239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
664d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
665d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
666d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
667d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
668d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
669d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
670d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
671d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
672d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
6733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
6743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
6753239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
6763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
677b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
678b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
679b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
680b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
6813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiProvider *wifi_provider() {
6823c5040174273386868cc8dea8044d22c465885d8Paul Stewart    return &wifi_provider_;
6833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  }
6843c5040174273386868cc8dea8044d22c465885d8Paul Stewart
685e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
6865c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
6875c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
6883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
690dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
6913426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
692f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
6932ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
694c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
6953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
6963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  NiceMock<MockWiFiProvider> wifi_provider_;
6973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  int bss_counter_;
6983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
7003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
7013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
7023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
703626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
7043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
7053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
706446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kBSSName[];
707446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  static const char kSSIDName[];
7083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
709dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
710b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
711f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
712f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
7132b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  NiceMock<MockDBusManager> *dbus_manager_;
7143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
7163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
717835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  NiceMock<TestProxyFactory> proxy_factory_;
7183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
7193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
720e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
721e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
722e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
723e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
724446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kBSSName[] = "bss0";
725446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewartconst char WiFiObjectTest::kSSIDName[] = "ssid0";
7263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
727e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
728b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
729261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
730261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
731e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
7323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
7333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
7343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
735e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
7363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
7373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
7383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
7403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
7413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
7423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
7433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
7443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
7453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
7463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
7473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
7483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
7503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
7513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
752e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
753e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
754e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
755e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
756e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
757b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
7583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
760e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
761b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
762b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
763b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
764b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
765b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
766b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
767b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
768e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
769e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
770e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
771e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
772e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
773e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
774e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
775e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
776e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
7773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
7783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
7793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
7803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
7823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
7833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
7843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7862b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, SupplicantPresent) {
7872b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantPresent());
7882b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
7892b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
7902b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
7912b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
7922b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
7932b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*dbus_manager_, WatchName(wpa_supplicant::kDBusAddr, _, _));
7942b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi(false);  // No supplicant present.
7952b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
7962b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
7972b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
7982b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
7999cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
8009cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is started, the device should be
8019cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // restarted.
8029cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
8039cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
8049cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
8052b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8062b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8072b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
8082b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8092b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8102b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
8112b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8129cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov
8139cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // If supplicant reappears while the device is stopped, the device should not
8149cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  // be restarted.
8159cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
8169cd7ca1c9b73f19f60f6ee5573c3cd5d7beaf4bfDarin Petkov  OnSupplicantAppear();
8172b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8182b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8192b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
8202b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
8212b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8222b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  StartWiFi();
8232b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
8242b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
8252b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8262b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_));
8272b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), RegisterDevice(_));
8282b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
8292b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8302b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
8312b8e44e4559ef85394e868963d9084b4e4148824Darin PetkovTEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
8322b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantAppear();
8332b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_TRUE(GetSupplicantPresent());
8342b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
8352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov  OnSupplicantVanish();
8362b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov}
8372b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov
838549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
8393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
8403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
8413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
8423c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
843549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  ScopedMockLog log;
844549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
845c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
846549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart                       EndsWith("silently resetting current_service_.")));
847549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), DeregisterDevice(_))
848549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart      .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
8493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
8503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
8513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
8523c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
8533c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
8543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
855549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_CALL(*manager(), RegisterDevice(_));
856549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  OnSupplicantVanish();
857549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
858549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
859549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
8603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
8613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
8623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
8633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
8643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
8653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
8663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
868b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
8693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
8703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
8713239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
872b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
8733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
875835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
8763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
877835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  DBus::Path network = "/test/path";
8783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
8793c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
880835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ClearCachedCredentials(service);
881835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
882835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
883381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetwork) {
884381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
885381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
8863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
887381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
888381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
889381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
890381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
891381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
8923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
893381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
894381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
895381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.NetworkUnknown",
896381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
897381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
898381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_TRUE(RemoveNetwork(network));
899381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
900381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
901ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiFiMainTest, UseArpGateway) {
902ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
903ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
904ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
905ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
906ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
907381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
908381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
9093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
910381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
911381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
912381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.InvalidArgs",
913381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
914381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
915381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
916381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
917381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
918381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen ChanTEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
919381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  DBus::Path network = "/test/path";
9203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
921381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan      .WillRepeatedly(Throw(
922381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan          DBus::Error(
923381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "fi.w1.wpa_supplicant1.UnknownError",
924381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan              "test threw fi.w1.wpa_supplicant1.UnknownError")));
925381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  StartWiFi();
926381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan  EXPECT_FALSE(RemoveNetwork(network));
927381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan}
928381fdcc47ebc780fa361a79c69f9248d5ff1d53bBen Chan
9293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
9303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
9313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
9323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
9333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
9343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
9352b8e44e4559ef85394e868963d9084b4e4148824Darin Petkov              "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
9363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
9373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
9383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9393239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
9403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
9433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
9443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
9453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
9463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
948c68c867905c985c0a703a7e2b575ecc091d14688Christopher WileyTEST_F(WiFiMainTest, NoScansWhileConnecting) {
949c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  StartWiFi();
9503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
9513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
9523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
954c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(service);
955c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // If we're connecting, we ignore scan requests to stay on channel.
9563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
957c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
958c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
959c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
960c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
9623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
963c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
964c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
965c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
966c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
968c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // Similarly, ignore scans when our connected service is reconnecting.
969c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetPendingService(NULL);
970c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  SetCurrentService(service);
9713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
972c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
973c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
974c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
975c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
977c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  // But otherwise we'll honor the request.
9783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
979c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
980c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  TriggerScan();
981c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  dispatcher_.DispatchPendingEvents();
982c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
984c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley}
985c68c867905c985c0a703a7e2b575ecc091d14688Christopher Wiley
9862f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
9873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
988ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
989ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
9903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
9915c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
992ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
993ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
9942f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
995ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
996ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
997ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
9982f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
9993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1000ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1001ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
10023c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1003ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
1004ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
10052f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnBeforeSuspend();
1006ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1007ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1008ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
10092f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawalTEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
10103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1011ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
1012ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
10133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
10143c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
10153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_FALSE(wifi()->IsIdle());
10163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ScopedMockLog log;
10173ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
10183ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
1019ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
10202f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
1021ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
1022ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
1023ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
10243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
10253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
10263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
1027e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
10283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1029e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
10303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1031e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
10323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
1033e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1034e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
1035e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1036e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
1037e41a72d0737488d561a4158019409d5785dad61bThieu Le
1038e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1039e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
1040e41a72d0737488d561a4158019409d5785dad61bThieu Le
1041e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
1042e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
1043e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
1044e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
1045e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
1046e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
1047e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
1048e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
1049e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
1050e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
1051e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
1052e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
10533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
10543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
10553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
10563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
10573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
10583c5040174273386868cc8dea8044d22c465885d8Paul Stewart                                                kNetworkModeAdHoc);
10593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
10603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
10613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
10623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
10633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
10643c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
10653c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeAdHoc);
10663c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
10673c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
10683c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
10693c5040174273386868cc8dea8044d22c465885d8Paul Stewart            kNetworkModeInfrastructure);
10703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
10713c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(wifi_provider());
10723c5040174273386868cc8dea8044d22c465885d8Paul Stewart
10733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
1074b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1075e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
1076e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
1077b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
1078e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
1079e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
10808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
10818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
10828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
10838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
10843c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
10853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
10863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
10873c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
10883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
10893c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
10903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
10913c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
10923c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
10938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
10943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1095261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
1096261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
1097261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1098261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
10993c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
11003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path;
11013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
11023c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
11033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
11043c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
11053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
11063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
11073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
11083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1109835934a8e009edf3b6b73717fe3ed336d6720d68Paul StewartTEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
1110835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  StartWiFi();
11113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath = "/test/path";
11123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1113835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1114835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Return the service to a connectable state.
11153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1116835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateDisconnect(service);
11173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11183c5040174273386868cc8dea8044d22c465885d8Paul Stewart
11193c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // Complete the disconnection by reporting a BSS change.
11203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1121835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1122835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // A second connection attempt should remember the DBus path associated
1123835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // with this service.
11243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
11253c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
1126835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  InitiateConnect(service);
1127835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart}
1128835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
11290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
11300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
11313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
11323c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
11333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_TRUE(GetPendingService() == service.get());
11343c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
11360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
11373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service.get());
11380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
11390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
11400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
11420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
11433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
11443c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
11453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0, GetCurrentService());
11463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
11470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11483c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // We don't explicitly call Disconnect() while transitioning to a new
11493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // service.  Instead, we use the side-effect of SelectNetwork (verified in
11503c5040174273386868cc8dea8044d22c465885d8Paul Stewart  // SetupConnectingService).
11513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
11523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
11533c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService("/new/path", NULL, NULL));
11543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
11570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
11583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
11593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
11613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1.get());
11620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
11640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
11650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
11660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
11673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetPendingService().get());
11682b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(GetPendingTimeout().IsCancelled());
11690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
11700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
11723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
11733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
11743c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
11753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
11760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
11770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
11780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
11790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
11800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
1181835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart
1182835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  // Expect that the entry associated with this network will be disabled.
1183835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy();
1184835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy(
11853c5040174273386868cc8dea8044d22c465885d8Paul Stewart      kPath, wpa_supplicant::kDBusAddr))
1186835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart      .WillOnce(Return(network_proxy));
1187835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  EXPECT_CALL(*network_proxy, SetEnabled(false));
11883c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
1189835934a8e009edf3b6b73717fe3ed336d6720d68Paul Stewart  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
11903c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
11913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
11920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
11930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
1194c618448120f8945d77d451242a7de6782d1e4189Christopher WileyTEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
11953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
11963c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
11973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
11983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
1199c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley      .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
12003c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1201c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  InitiateDisconnect(service);
1202c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
1203c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // We may sometimes fail to disconnect via supplicant, and we patch up some
1204c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  // state when this happens.
1205c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, GetCurrentService().get());
1206c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley  EXPECT_EQ(NULL, wifi()->selected_service().get());
1207c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley}
1208c618448120f8945d77d451242a7de6782d1e4189Christopher Wiley
12090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
12100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
12113c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL));
12123c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL));
12130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
12140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
12153c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
12160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
12170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
12190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
12202b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(GetPendingTimeout().IsCancelled());
12212b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart}
12222b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart
12232b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul StewartTEST_F(WiFiMainTest, TimeoutPendingService) {
12242b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  StartWiFi();
12252b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  const base::CancelableClosure &pending_timeout = GetPendingTimeout();
12262b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_TRUE(pending_timeout.IsCancelled());
12273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
12283c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
12292b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_FALSE(pending_timeout.IsCancelled());
12302b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_EQ(service, GetPendingService());
12313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
12323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  pending_timeout.callback().Run();
12330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
12360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
12373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
12383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
12393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
12400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
12410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
12443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path kPath("/fake/path");
12463c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
12473c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
12480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
12490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
12500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
12510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
12523c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
12530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
12543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
12550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
12560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
12575c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1258c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
12593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint0;
12603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path kPath("/fake/path");
12613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
12623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint1;
12633c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
12643c5040174273386868cc8dea8044d22c465885d8Paul Stewart
12653c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
12663c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
12673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
12683c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
12693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
1270c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1271b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1272c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
12735c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
12745c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1275549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul StewartTEST_F(WiFiMainTest, StopWhileConnected) {
12763c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
12783c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiServiceRefPtr service(
12793c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL));
12803c5040174273386868cc8dea8044d22c465885d8Paul Stewart  scoped_ptr<EndpointRemovalHandler> handler(
12813c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeEndpointRemovalHandler(service));
12823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
12833c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Invoke(handler.get(),
12843c5040174273386868cc8dea8044d22c465885d8Paul Stewart                &EndpointRemovalHandler::OnEndpointRemoved));
12853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1286549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  StopWiFi();
1287549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart  EXPECT_TRUE(GetCurrentService() == NULL);
1288549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart}
1289549d44cd58f2ee46279f3f5a03de2f07e7c439aaPaul Stewart
1290446639208c7678fd0ef452caf8ce63b6596d25e2Paul StewartTEST_F(WiFiMainTest, ReconnectTimer) {
12913c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
12923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
12933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
12943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
12951aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1296446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
12971aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1298446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
12991aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1300446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
13011aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
1302446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportCurrentBSSChanged(kBSSName);
13031aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1304446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart  ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
13051aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
13063c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
13071aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
13083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
13091aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
1310446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart}
1311446639208c7678fd0ef452caf8ce63b6596d25e2Paul Stewart
1312cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
1313ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
1314a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
1315ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
1316ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1317ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1318ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1319ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1320ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1321ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1322ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1323ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1324ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1325ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1326ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
13273c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
13283c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
13293c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13303c5040174273386868cc8dea8044d22c465885d8Paul StewartMATCHER(HasNoHiddenSSID, "") {
13313c5040174273386868cc8dea8044d22c465885d8Paul Stewart  map<string, DBus::Variant>::const_iterator it =
13323c5040174273386868cc8dea8044d22c465885d8Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
13333c5040174273386868cc8dea8044d22c465885d8Paul Stewart  return it == arg.end();
1334ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1335ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1336ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
13373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
13383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
13393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
13403c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13413c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
13423c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
13433c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
13443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  dispatcher_.DispatchPendingEvents();
13453c5040174273386868cc8dea8044d22c465885d8Paul Stewart}
13463c5040174273386868cc8dea8044d22c465885d8Paul Stewart
13473c5040174273386868cc8dea8044d22c465885d8Paul StewartTEST_F(WiFiMainTest, ScanNoHidden) {
1348ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
13493c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
13503c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillOnce(Return(ByteArrays()));
13513c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID()));
1352ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1353ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1354ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1355fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul StewartTEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1356fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  ScopedMockLog log;
1357fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1358fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith(
1359fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart      "Ignoring scan request while device is not enabled."))).Times(1);
13603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1361fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StartWiFi();
1362fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  StopWiFi();
1363fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  // A scan is queued when WiFi resumes.
1364fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  OnAfterResume();
1365fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart  dispatcher_.DispatchPendingEvents();
1366fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart}
1367fae4daec29b1dd9c0f288a149a302e740a1f29a3Paul Stewart
13687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
13697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
13707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
13737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
13747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
13757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
13767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
13797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
13807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1382cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
13837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
13857ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
13867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
13877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
13887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1389d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
13907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13917ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13927ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
13937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
13947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1395d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1396d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
13977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1399cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
14002b05e62aee046cdabbf7edbc4cf45cef961d30a1Paul Stewart  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1401d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
14027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
14037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
14057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
14067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
14077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
14087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service);
14103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
14117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1413a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
1414a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1415a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1416a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1417a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1418a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
1419a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
1420a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1421a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(false));
1422a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1423a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1424a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1425a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul StewartTEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
1426a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // Turn of WiFi debugging, so the only reason we will turn on supplicant
1427a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // debugging will be to debug a problematic connection.
1428a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1429a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1430a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1431a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  StartWiFi();
1432a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  dispatcher_.DispatchPendingEvents();
1433a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1434a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
1435a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelInfo));
1436a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(wpa_supplicant::kDebugLevelDebug))
1437a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
1438a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1439a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(true));
1440a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  InitiateConnect(service);
1441a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
1442a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1443a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetPendingService(NULL);
1444a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  SetCurrentService(service);
1445a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
1446a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // When we disconnect from the troubled service, we should reduce the
1447a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  // level of supplciant debugging.
1448a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
1449a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelDebug));
1450a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(wpa_supplicant::kDebugLevelInfo))
1451a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart      .Times(1);
1452a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1453a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart}
1454a47c3c62552d33aa1f745097a5713c4f6f4cc325Paul Stewart
14551590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
14561590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
14573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
14583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
14593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), &endpoint, NULL);
14601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14613c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetState(Service::kStateIdle));
14623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown));
14631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
14641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
14651590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14661590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14681590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
14691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
14703c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0 =
14713c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
14723c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1;
14733c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path1(MakeNewEndpointAndService(
14743c5040174273386868cc8dea8044d22c465885d8Paul Stewart      0, 0, kNetworkModeAdHoc, NULL, &service1));
14753c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetCurrentService().get());
14761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1477c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1478c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1479c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1480c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
14813c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
14823c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path1);
14833c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
14841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14853c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetCurrentService().get());
14863c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service0);
14873c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(service1);
14881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1490e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1491e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
14923c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
14933c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL);
14943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  WiFiEndpointRefPtr endpoint;
14953c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ::DBus::Path bss_path =
14963c5040174273386868cc8dea8044d22c465885d8Paul Stewart      AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
14973c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
14983c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ReportCurrentBSSChanged(bss_path);
14994eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
15004eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
15018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
15028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15033c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service0(
15043c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15053c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service0.get(), GetPendingService().get());
15068a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service1(
15083c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15093c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(service1.get(), GetPendingService().get());
15103c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_EQ(NULL, GetCurrentService().get());
15118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
15148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15158a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
15163c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
15173c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
15188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
15198a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15208a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15214a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovMATCHER_P(WiFiAddedArgs, bgscan, "") {
15224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
15234a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov      ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan) == bgscan;
15244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
15274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
15283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
15293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
15303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
15314a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
15324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
15334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15344d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15354a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
15364a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
15373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service;
15383c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
15393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
15404a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  InitiateConnect(service);
15414a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
15424a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
15434a66cc5e91ad82743ab196257438e3a0c313aab7Darin PetkovTEST_F(WiFiMainTest, AppendBgscan) {
15444a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  StartWiFi();
15453c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
15464a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15474a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 1 endpoint, default bgscan method -- background scan disabled.
15484a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
15493c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
15503c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15513c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15524a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_FALSE(ContainsKey(params, wpa_supplicant::kNetworkPropertyBgscan));
15534a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
15544a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15554a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // 2 endpoints, default bgscan method -- background scan frequency reduced.
15564a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    map<string, DBus::Variant> params;
15573c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
15583c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15593c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15604a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
15614a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
15624a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
15634a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  wpa_supplicant::kNetworkPropertyBgscan,
15644a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
15654a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
15664a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
15674a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
15684a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
15694a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
15704a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
15714a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
15724a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  {
15734a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    // Explicit bgscan method -- regular background scan frequency.
15744a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
15754a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    std::map<std::string, DBus::Variant> params;
15763c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
15773c5040174273386868cc8dea8044d22c465885d8Paul Stewart    AppendBgscan(service, &params);
15783c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15794a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    string config_string;
15804a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_TRUE(
15814a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov        DBusProperties::GetString(params,
15824a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  wpa_supplicant::kNetworkPropertyBgscan,
15834a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov                                  &config_string));
15844a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    vector<string> elements;
15854a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    base::SplitString(config_string, ':', &elements);
15864a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    ASSERT_EQ(4, elements.size());
15874a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov    EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
15884a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov              elements[3]);
15894a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov  }
15905c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  {
15915c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    // No scan method, simply returns without appending properties
15925c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodNone));
15935c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    std::map<std::string, DBus::Variant> params;
15943c5040174273386868cc8dea8044d22c465885d8Paul Stewart    EXPECT_CALL(*service, GetEndpointCount()).Times(0);
15955c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    AppendBgscan(service.get(), &params);
15963c5040174273386868cc8dea8044d22c465885d8Paul Stewart    Mock::VerifyAndClearExpectations(service);
15975c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    string config_string;
15985c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley    EXPECT_FALSE(
15995c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley        DBusProperties::GetString(params,
16005c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  wpa_supplicant::kNetworkPropertyBgscan,
16015c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley                                  &config_string));
16025c929e250fa0295f3ac8ec6167dd35642c8a1635Christopher Wiley  }
16034a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov}
16044a66cc5e91ad82743ab196257438e3a0c313aab7Darin Petkov
1605c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1606c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
16073c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16083c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL));
1609c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1610c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1611c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1612c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1613c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1614c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1615c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1616c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1617c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1618c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1619c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
16203c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service(
16213c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectedService(DBus::Path(), NULL, NULL));
16228f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  Mock::VerifyAndClearExpectations(dhcp_config_.get());
1623c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
16248f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Simulate a rekeying event from the AP.  These show as transitions from
16258f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // completed->completed from wpa_supplicant.
16268f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
16275519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // When we get an IP, WiFi should enable high bitrates on the interface again.
16283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16293c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
16303c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
16318f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  ReportIPConfigComplete();
16328f81e2a3e3e25345d04ab0b93d09e61cb73153aaChristopher Wiley  // Similarly, rekeying events after we have an IP don't trigger L3
16335519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // configuration.  However, we treat all transitions to completed as potential
16345519e9e7021ba05af8c38291710746fac3528f21Christopher Wiley  // reassociations, so we will reenable high rates again here.
16353c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
16363c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
16373c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
1638c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1639c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1640c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1641b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1642b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1643b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
1644b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
1645b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1646b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1647b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1648b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1649b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1650b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1651b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1652b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1653b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
1654b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
1655b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1656b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
1657b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
16583c5040174273386868cc8dea8044d22c465885d8Paul Stewart  DBus::Path bss_path(
16593c5040174273386868cc8dea8044d22c465885d8Paul Stewart      MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
16603c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
16613c5040174273386868cc8dea8044d22c465885d8Paul Stewart     .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
16623c5040174273386868cc8dea8044d22c465885d8Paul Stewart  RemoveBSS(bss_path);
1663b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
1664b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
1665b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
1666b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1667b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
16685c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
16695c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
16705c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
16715c05b2920be742d518829972127172481722058dmukesh agrawal
16725c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
16735c05b2920be742d518829972127172481722058dmukesh agrawal
16745c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
16755c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
16765c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
16773c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
16785c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
16792f9df4eebeb6363e38834ff1e13fac5836c8eb5dmukesh agrawal  OnAfterResume();
16805c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
16815c05b2920be742d518829972127172481722058dmukesh agrawal}
16825c05b2920be742d518829972127172481722058dmukesh agrawal
1683b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerIdle) {
1684b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1685b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1686b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1687b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1688b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1689b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1690b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1691b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1692b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1693b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1694b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1695b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1696b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
1697b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1698b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1699b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1700b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1701b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1702b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
1703b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
1704b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1705b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1706b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1707b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1708b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1709b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1710b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
1711b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1712b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17133c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service =
17143c5040174273386868cc8dea8044d22c465885d8Paul Stewart      SetupConnectingService(DBus::Path(), NULL, NULL);
1715b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1716b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1717b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1718b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1719b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1720b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1721b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1722b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1723b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1724b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
1725b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1726b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1727b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1728b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1729b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(1);
1730b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1731b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1732b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1733b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1734b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1735b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1736b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1737b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1738b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1739b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1740b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1741b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1742b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1743b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1744b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1745b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1746b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(0);
1747b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1748b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1749b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1750b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1751b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1752b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17533c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
17543c5040174273386868cc8dea8044d22c465885d8Paul Stewart  vector<uint8_t>kSSID(1, 'a');
17553c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ByteArrays ssids;
17563c5040174273386868cc8dea8044d22c465885d8Paul Stewart  ssids.push_back(kSSID);
17573c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17583c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ssids));
17593c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
1760b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1761b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1762b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1763b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1764b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1765b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1766b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
17673c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
1768b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
17693c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
17703c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .WillRepeatedly(Return(ByteArrays()));
1771b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1772b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1773b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1774b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
17753c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul StewartTEST_F(WiFiMainTest, LinkMonitorFailure) {
17763c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  StartWiFi();
17773c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  ScopedMockLog log;
17783c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
17793c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
17803c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  SetLinkMonitor(link_monitor);
17813c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*link_monitor, IsGatewayFound())
17823c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillOnce(Return(false))
17833c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart      .WillRepeatedly(Return(true));
17843c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
17853c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("gateway was never found."))).Times(1);
17863c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
17873c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
17883c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
17893c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Called Reassociate()."))).Times(1);
17903c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
17913c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
17923c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnSupplicantVanish();
17933c5040174273386868cc8dea8044d22c465885d8Paul Stewart  Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
17943c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
17953c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
17963c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart                       EndsWith("Cannot reassociate."))).Times(1);
17973c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart  OnLinkMonitorFailure();
17983c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart}
17993c508e19fecd24dd8872d493c5cc6dfdfbe70f17Paul Stewart
1800cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
18013c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1802cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1803cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
18041369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
1805cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1806cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1807cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
18083c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1809cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1810cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
18111369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
18121369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
18131369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureBadPassphrase, failure);
1814cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1815cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1816cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
18173c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1818cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1819cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  service->has_ever_connected_ = true;
18201369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
1821cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1822cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
18231369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
18243c5040174273386868cc8dea8044d22c465885d8Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
18251369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
18261369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = false;
18271369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18281369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusStarted, "");
18291369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = true;
18301369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18311369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  service->has_ever_connected_ = false;
18321369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  Service::ConnectFailure failure;
18331369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_TRUE(SuspectCredentials(*service, &failure));
18341369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
18351369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusCompletion,
18361369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                 wpa_supplicant::kEAPParameterSuccess);
18371369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(SuspectCredentials(*service, NULL));
18381369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
18391369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18401369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
18411369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ScopedMockLog log;
1842cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1843cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
1844cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1845cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
1846cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1847f2d609103916861ea8a9377ef93a72cc998bdf80Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
184856e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
184956e322015a6955035bae144917190c9eccbd90c6mukesh agrawal  EXPECT_CALL(*service, SetState(_)).Times(0);
1850cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
18511369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
18521369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(flimflam::kErrorBadPassphrase)));
18531369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
18541369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart}
18551369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18561369c2b482e97a18e8ecb63df04799696ebe39d6Paul StewartTEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
18571369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ScopedMockLog log;
18581369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
18591369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  SetCurrentService(service);
18601369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusStarted, "");
18611369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_FALSE(service->has_ever_connected());
18621369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart
18631369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
18641369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
18651369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(*service, SetState(_)).Times(0);
18661369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
18671369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
18681369c2b482e97a18e8ecb63df04799696ebe39d6Paul Stewart                       EndsWith(shill::kErrorEapAuthenticationFailed)));
1869cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1870cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1871cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1872e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
1873e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
18741aff7307d462b0160e821607058fe13831d8ef63Paul Stewartclass WiFiTimerTest : public WiFiObjectTest {
1875e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
18761aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
1877e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1878e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1879e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
1880e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1881e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
1882e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1883e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
18841aff7307d462b0160e821607058fe13831d8ef63Paul Stewartvoid WiFiTimerTest::ExpectInitialScanSequence() {
1885e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
1886e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
1887e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
1888e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1889e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
1890e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
1891e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
1892e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
1893e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
1894e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
1895e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
1896e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
1897e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
1898e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
1899e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1900e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
1901e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
1902e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1903e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1904e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
1905e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1906e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
1907e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
1908e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1909e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1910e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
1911e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
1912e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
1913e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
1914e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
1915e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
19161aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, FastRescan) {
1917e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
1918e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
1919e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
1920e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1921e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
1922e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
1923e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
1924e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1925e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
1926e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1927e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
1928e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1929e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
1930e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
1931e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
1932e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1933e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
1934e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
1935e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
19361aff7307d462b0160e821607058fe13831d8ef63Paul StewartTEST_F(WiFiTimerTest, ReconnectTimer) {
19371aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
19381aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
19393c5040174273386868cc8dea8044d22c465885d8Paul Stewart  StartWiFi();
19403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  SetupConnectedService(DBus::Path(), NULL, NULL);
19411aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19421aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19431aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19441aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
19451aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19461aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19471aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StopReconnectTimer();
19481aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
19491aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19501aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
19511aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19521aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  Mock::VerifyAndClearExpectations(&mock_dispatcher_);
19531aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  GetReconnectTimeoutCallback().callback().Run();
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
19601aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
19611aff7307d462b0160e821607058fe13831d8ef63Paul Stewart      _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
19621aff7307d462b0160e821607058fe13831d8ef63Paul Stewart  StartReconnectTimer();
19631aff7307d462b0160e821607058fe13831d8ef63Paul Stewart}
19641aff7307d462b0160e821607058fe13831d8ef63Paul Stewart
1965bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
1966bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
1967bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
1968bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1969bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
1970bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
1971bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
1972bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1973bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1974bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1975bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
1976bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
1977bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1978bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1979bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1980bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
1981bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
1982bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1983bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
1984bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
1985bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1986bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
1987bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1988bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
1989bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  args[wpa_supplicant::kInterfacePropertySubject].writer()
1990bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
1991bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
1992bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
1993db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart}
1994db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
1995db0f917217979bf7547e27b47faf1b49d25c8d9cPaul StewartTEST_F(WiFiMainTest, EAPEvent) {
1996db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
1997db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
1998db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
1999db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ScopedMockLog log;
2000db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2001db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(string(), string());
2002db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2003db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2004db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
2005db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  const string kEAPMethod("EAP-ROCHAMBEAU");
2006db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2007db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                       EndsWith("accepted EAP method " + kEAPMethod)));
2008db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusAcceptProposedMethod, kEAPMethod);
2009db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2010db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, EndsWith("Completed authentication."))).Times(1);
2011db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusCompletion,
2012db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 wpa_supplicant::kEAPParameterSuccess);
2013db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2014db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(&log);
2015db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2016db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2017db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  // An EAP failure without a previous TLS indication yields a generic failure.
2018db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2019db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service,
20203c5040174273386868cc8dea8044d22c465885d8Paul Stewart              DisconnectWithFailure(Service::kFailureEAPAuthentication, NULL))
20213c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
2022db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusCompletion,
2023db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 wpa_supplicant::kEAPParameterFailure);
2024db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2025db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2026db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  // An EAP failure with a previous TLS indication yields a specific failure.
2027db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
20283c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
2029db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2030db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusLocalTLSAlert, string());
2031db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
20323c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service,
20333c5040174273386868cc8dea8044d22c465885d8Paul Stewart              DisconnectWithFailure(Service::kFailureEAPLocalTLS, NULL))
20343c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
2035db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusCompletion,
2036db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 wpa_supplicant::kEAPParameterFailure);
2037db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
2038db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart
2039db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  SetCurrentService(service);
20403c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service, DisconnectWithFailure(_, _)).Times(0);
2041db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(*service, SetFailure(_)).Times(0);
2042db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusRemoteTLSAlert, string());
2043db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  Mock::VerifyAndClearExpectations(service.get());
20443c5040174273386868cc8dea8044d22c465885d8Paul Stewart  EXPECT_CALL(*service,
20453c5040174273386868cc8dea8044d22c465885d8Paul Stewart              DisconnectWithFailure(Service::kFailureEAPRemoteTLS, NULL))
20463c5040174273386868cc8dea8044d22c465885d8Paul Stewart      .Times(1);
2047db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusCompletion,
2048db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 wpa_supplicant::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);
2054db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  const string kStrangeParameter("ennui");
2055db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _,EndsWith(
2056db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart      string("Unexpected ") +
2057db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart      wpa_supplicant::kEAPStatusRemoteCertificateVerification +
2058db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart      " parameter: " + kStrangeParameter)));
2059db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart  ReportEAPEvent(wpa_supplicant::kEAPStatusRemoteCertificateVerification,
2060db0f917217979bf7547e27b47faf1b49d25c8d9cPaul Stewart                 kStrangeParameter);
2061bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
2062bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2063c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawalTEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2064c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Scan is one task that should be skipped after Stop. Others are
2065c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // skipped by the same mechanism (invalidating weak pointers), so we
2066c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // don't test them individually.
2067c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  //
2068c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // Note that we can't test behavior by setting expectations on the
2069c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2070c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StartWiFi();
2071c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  StopWiFi();
2072c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal  dispatcher_.DispatchPendingEvents();
2073c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal}
2074c4f368f4dfb2f2ba7727a2fd62d3e0ced05dd45emukesh agrawal
207560ceaf336297ce536201a82e350c697f1a5b546dDarin PetkovTEST_F(WiFiMainTest, VerifyPaths) {
207660ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  string path = WiFi::kSupplicantConfPath;
207760ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  TrimString(path, FilePath::kSeparators, &path);
207860ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov  EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
207960ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov}
208060ceaf336297ce536201a82e350c697f1a5b546dDarin Petkov
20816d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shahstruct BSS {
20826d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bsspath;
20836d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string ssid;
20846d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  string bssid;
20856d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  int16_t signal_strength;
20866d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  uint16 frequency;
20876d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  const char* mode;
20886d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
20896d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
20906d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav ShahTEST_F(WiFiMainTest, GetGeolocationObjects) {
20916d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  BSS bsses[] = {
20926d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
20936d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
20946d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
20956d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure},
20966d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    // Same SSID but different BSSID is an additional geolocation object.
20976d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
20986d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah     kNetworkModeInfrastructure}
20996d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
21006d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  StartWiFi();
21016d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  vector<GeolocationInfo> objects;
21026d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  EXPECT_EQ(objects.size(), 0);
21036d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21046d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  for (size_t i = 0; i < arraysize(bsses); ++i) {
21056d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
21066d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah              bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
21076d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    objects = wifi()->GetGeolocationObjects();
21086d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_EQ(objects.size(), i + 1);
21096d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21106d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    GeolocationInfo expected_info;
21116d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
21126d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoSignalStrengthProperty,
21136d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah                           StringPrintf("%d", bsses[i].signal_strength));
21146d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    expected_info.AddField(kGeoChannelProperty, StringPrintf(
21156d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah        "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
21166d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah    EXPECT_TRUE(objects[i].Equals(expected_info));
21176d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah  };
21186d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah};
21196d2c72dddf3dbbc6a614d4fa1a7a3d670756c01fGaurav Shah
21205581d07d765e14737d2a639d3eb42e0b42721602Paul StewartTEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
21215581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
21225581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21235581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // With WiFi not yet started, nothing interesting (including a crash) should
21245581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // happen.
21255581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
21265581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21275581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21285581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21295581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // This unit test turns on WiFi debugging, so when we start WiFi, we should
21305581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // check but not set the debug level if we return the "debug" level.
21315581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21325581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelDebug));
21335581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21345581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StartWiFi();
21355581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21365581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21375581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is toggled and wpa_supplicant reports debugging
21385581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is set to some unmanaged level, WiFi should leave it alone.
21395581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21405581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelError))
21415581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelError))
21425581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelExcessive))
21435581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelExcessive))
21445581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelMsgDump))
21455581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelMsgDump))
21465581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelWarning))
21475581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelWarning));
21485581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21495581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21505581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21515581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21525581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21535581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21545581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21555581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21565581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21575581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21585581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21595581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned off and wpa_supplicant reports debugging
21605581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned on, WiFi should turn supplicant debugging off.
21615581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21625581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelDebug));
21635581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(wpa_supplicant::kDebugLevelInfo))
21645581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
21655581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21665581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21675581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21685581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is turned on and wpa_supplicant reports debugging
21695581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // is turned off, WiFi should turn supplicant debugging on.
21705581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21715581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelInfo));
21725581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(wpa_supplicant::kDebugLevelDebug))
21735581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .Times(1);
21745581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21755581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  Mock::VerifyAndClearExpectations(process_proxy);
21765581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21775581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // If WiFi debugging is already in the correct state, it should not be
21785581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // changed.
21795581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel())
21805581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelDebug))
21815581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart      .WillOnce(Return(wpa_supplicant::kDebugLevelInfo));
21825581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21835581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21845581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21855581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
21865581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  // After WiFi is stopped, we shouldn't be calling the proxy.
21875581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
21885581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
21895581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  StopWiFi();
21905581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(true);
21915581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart  ReportWiFiDebugScopeChanged(false);
21925581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart}
21935581d07d765e14737d2a639d3eb42e0b42721602Paul Stewart
219450cb78aa736cf39ee8c7e0193a78792a9686a108Darin PetkovTEST_F(WiFiMainTest, LogSSID) {
219550cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
219650cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov  EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
219750cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov}
219850cb78aa736cf39ee8c7e0193a78792a9686a108Darin Petkov
2199853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
2200