wifi_unittest.cc revision 3ab56acd3681faabdee8d09b8441aea76bf81945
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>
13a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include <set>
14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
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>
213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h>
22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
231830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal#include <dbus-c++/dbus.h>
247156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h>
252ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h>
26853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
27853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
2826b327e559583d5a84b7e1605c29a4dcbc87d2a9Paul Stewart#include "shill/event_dispatcher.h"
298ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal#include "shill/ieee80211.h"
307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal#include "shill/key_value_store.h"
31853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
32853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
33c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal#include "shill/mock_device_info.h"
34f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
35f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
36e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart#include "shill/mock_event_dispatcher.h"
37cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal#include "shill/mock_log.h"
382ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
393426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
40ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain#include "shill/mock_power_manager.h"
41ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain#include "shill/mock_power_manager_proxy.h"
4210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
435c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
44a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
45b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
485c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
50dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
51853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
533ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal#include "shill/scope_logger.h"
543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
553239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
56ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
57853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
58ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
60a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing std::set;
61853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
62853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
63853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
66a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
67cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalusing ::testing::EndsWith;
683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
69b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
71dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
72853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
73ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
74a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
75a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
76a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
798ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
81853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
82853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
863426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
873426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                         NULL, NULL, NULL, "wifi", "", 0)) {
88853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
91853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
928abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
93853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
96de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
97de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
98853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1006bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
101a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
102a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1036bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
104de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
105a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
106a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
107a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
108a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
109a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
110a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1116bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1126bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1136bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1146bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
115a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
116853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
117a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
118a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1196bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1206bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1216bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1226bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
1239d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
124a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
125853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1286bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal            wpa_supplicant::kNetworkBgscanMethodSimple),
1334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1344d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1386bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1404d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1414d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1424d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1434d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1444d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1454d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1468abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawalTEST_F(WiFiPropertyTest, ClearDerivedProperty) {
1478abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
1488abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1498abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1508abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1518abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1526bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1558abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1568abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal          wpa_supplicant::kNetworkBgscanMethodLearn),
1578abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1588abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
1598abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1608abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
1618abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
1628abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1638abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
1648abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
165e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiObjectTest : public ::testing::TestWithParam<string> {
1663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
167e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiObjectTest(EventDispatcher *dispatcher)
168e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      : event_dispatcher_(dispatcher),
169e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        manager_(&control_interface_, NULL, &metrics_, &glib_),
170e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
171626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
172e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart                       dispatcher,
1733426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
174626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
175626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
176626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
177626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
178dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
179dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
180dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
181b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
182b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
183f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
184d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart                                        kDeviceName)),
185ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        proxy_factory_(this),
1863e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood        power_manager_(new MockPowerManager(&proxy_factory_)) {
1873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
1884eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // Except for WiFiServices created via WiFi::GetService, we expect
1894eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // that any WiFiService has been registered with the Manager. So
1904eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // default Manager.HasService to true, to make the common case
1914eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // easy.
1924eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    ON_CALL(manager_, HasService(_)).
1934eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal        WillByDefault(Return(true));
194c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
195d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart    ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
196c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
197c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
198c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
199ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
200ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    // |manager_| takes ownership of |power_manager_|.
201ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    manager_.set_power_manager(power_manager_);
2025c05b2920be742d518829972127172481722058dmukesh agrawal
2035c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
2043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2065c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
2073ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
2083ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("wifi");
209ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2115c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
212c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(manager_, device_info()).
213c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(&device_info_));
214b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone    EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
215b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2165c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2175c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2185c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
219d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
220910011207d66e14bf753d2783e131e7558126430Gary Morain    EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
221910011207d66e14bf753d2783e131e7558126430Gary Morain        .Times(AnyNumber());
2229a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
223b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
224b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
225b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
226ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2309a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2315c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
2323ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    // Reset scope logging, to avoid interfering with other tests.
2333ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal    ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
234f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
235f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
2363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
2387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
2403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
241e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    explicit TestProxyFactory(WiFiObjectTest *test);
2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
2441830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
245dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
2463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
2491830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const WiFiRefPtr &/*wifi*/,
2501830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
2511830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
252dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
255b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
256b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
257b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
258b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
259b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
260b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
261ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
262ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        PowerManagerProxyDelegate */*delegate*/) {
263ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain      return new MockPowerManagerProxy();
264ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    }
265ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
2663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
267b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
268b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
269b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
270b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
271b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
272b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
273b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
274e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    WiFiObjectTest *test_;
2753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
2763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
277b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
278b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
279b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
2801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
2811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    bool hidden_ssid = false;
2821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
2831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
284b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
285b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
286b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
2871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
2881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
2891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
290bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void SetCurrentService(const WiFiServiceRefPtr &service) {
291bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->current_service_ = service;
292bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
294165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
2971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
2981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
299b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
300b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
301b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
302165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const vector<WiFiServiceRefPtr> &GetServices() {
303165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->services_;
3043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
306e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // proxies instantiated by WiFiObjectTest), to ensure that WiFi
3073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
3083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
3093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
3103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
3128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
3138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
3143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
3167ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
3177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
3187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void InitiateConnect(WiFiServiceRefPtr service) {
3196e277774580c52073c919c4cbebedae27861d845mukesh agrawal    map<string, ::DBus::Variant> params;
3206e277774580c52073c919c4cbebedae27861d845mukesh agrawal    wifi_->ConnectTo(service, params);
3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  void InitiateDisconnect(WiFiServiceRefPtr service) {
3230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal    wifi_->DisconnectFrom(service);
3240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  }
3251590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
326e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal    return WiFiEndpoint::MakeOpenEndpoint(
327e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal        &proxy_factory_, NULL, ssid, bssid, 0, 0);
3281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
329cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
3307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    vector<uint8_t> ssid(1, 'a');
3317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return new MockWiFiService(
3327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &control_interface_,
333e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        event_dispatcher_,
3343426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le        &metrics_,
3357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &manager_,
3367ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        wifi_,
3377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        ssid,
3387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kModeManaged,
339cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal        security,
3407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        false);
3417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
342261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
3433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
3443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
3453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
3463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
347e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
3483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
34966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  void ClearCachedCredentials() {
35066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart    wifi_->ClearCachedCredentials();
35166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  }
352c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
35379d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
354c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
355f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
356f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
357f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
3583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
359dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
3603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
3621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
3631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
3647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
3657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
3667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
367cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  void SetPendingService(const WiFiServiceRefPtr &service) {
368cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    wifi_->pending_service_ = service;
369cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  }
370b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void SetScanInterval(uint16_t interval_seconds) {
371b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetScanInterval(interval_seconds, NULL);
372b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
373e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  uint16_t GetScanInterval() {
374e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    return wifi_->GetScanInterval(NULL);
375e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
3763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
377ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
378ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        .WillOnce(SaveArg<1>(&power_state_callback_));
379b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
3803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
382910011207d66e14bf753d2783e131e7558126430Gary Morain    EXPECT_CALL(*power_manager_,
383910011207d66e14bf753d2783e131e7558126430Gary Morain                RemoveStateChangeCallback(wifi_->UniqueName()));
384b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
3853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
386cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  WiFiServiceRefPtr GetOpenService(const char *service_type,
387cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                                   const char *ssid,
388cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                                   const char *mode,
389cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                                   Error *result) {
390cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
3917a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
392cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  WiFiServiceRefPtr GetService(const char *service_type,
393cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                               const char *ssid,
394cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                               const char *mode,
395cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                               const char *security,
396cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                               const char *passphrase,
397cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                               Error *result) {
398cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal    return GetServiceInner(service_type, ssid, mode, security, passphrase,
399cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                           false, result);
400ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
401ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  WiFiServiceRefPtr GetServiceInner(const char *service_type,
402ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *ssid,
403ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *mode,
404ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *security,
405ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *passphrase,
406a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                    bool allow_hidden,
407ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    Error *result) {
4087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    map<string, ::DBus::Variant> args;
4097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // in general, we want to avoid D-Bus specific code for any RPCs
4107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // that come in via adaptors. we make an exception here, because
4117a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // calls to GetWifiService are rerouted from the Manager object to
4127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // the Wifi class.
4137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (service_type != NULL)
4147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kTypeProperty].writer().append_string(service_type);
4157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (ssid != NULL)
4167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSSIDProperty].writer().append_string(ssid);
4177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (mode != NULL)
4187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kModeProperty].writer().append_string(mode);
4197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (security != NULL)
4207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSecurityProperty].writer().append_string(security);
4217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (passphrase != NULL)
4227a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
423a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    if (!allow_hidden)
424a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
4257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
426ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    Error e;
427ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    KeyValueStore args_kv;
4287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
429ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return wifi_->GetService(args_kv, result);
4307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
431cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
432cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
433cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart                                            Error *result) {
434cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart    return wifi_->GetService(args, result);
435cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  }
436cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
437a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
438a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &mode,
439a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &security) {
440a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->FindService(ssid, mode, security);
441a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
442a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  bool LoadHiddenServices(StoreInterface *storage) {
443a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->LoadHiddenServices(storage);
444a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
445a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
446a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
447a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
448a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kTypeWifi,
449a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                kDeviceAddress,
450a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                hex_ssid.c_str(),
451a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kModeManaged,
452a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kSecurityNone));
453a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const char *groups[] = { id->c_str() };
454a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
455a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(Return(set<string>(groups, groups + 1)));
456a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
457a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
458a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
459a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
460a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
461bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  void ReportCertification(const map<string, ::DBus::Variant> &properties) {
462bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart    wifi_->CertificationTask(properties);
463bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  }
46410ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
465e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void RestartFastScanAttempts() {
466e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    wifi_->RestartFastScanAttempts();
467e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
468e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
46910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
47010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
47110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
47210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
4733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
4743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
4753239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
476d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
477d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
478d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
479d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
480d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
481d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
482d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
483d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
484d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
4853e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  const PowerManager::PowerStateCallback &power_state_callback() const {
486ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    return power_state_callback_;
487ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  }
488ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
4893239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
4903239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
4913239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
4923239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
493b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
494b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
495b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
496b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
497e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher *event_dispatcher_;
4985c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
4995c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
5003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
502dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
5033426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
504f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
5052ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
506c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
5073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
5083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
5103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
5113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
5123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
513626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
5143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
5153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
5163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
517dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
518dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
519b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
520f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
521f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
5223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
5243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
525ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  MockPowerManager *power_manager_;
5263e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  PowerManager::PowerStateCallback power_state_callback_;
5273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
5283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
529e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceName[] = "wlan0";
530e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kDeviceAddress[] = "000102030405";
531e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
532e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartconst char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
5333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
534e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
535b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
536261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
537261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
538e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
5393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
5403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
5413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
542e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
5433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
5443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
5453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
5483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
5493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
5523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
5533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
5543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
5553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
5573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
5583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
559e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
560e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
561e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
562e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
563e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
564b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
5653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
567e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartWiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
568b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
569b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
570b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
571b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
572b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
573b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
574b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
575e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Most of our tests involve using a real EventDispatcher object.
576e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiMainTest : public WiFiObjectTest {
577e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
578e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
579e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
580e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
581e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EventDispatcher dispatcher_;
582e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
583e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
5843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
5853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
5863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
5873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
5903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
5913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
5943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
5953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
5963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
5973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
5983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
5993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
6003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
6013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
602b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
6033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
6043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
605b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
6063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
6093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
6103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
6113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
6123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
6133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
6143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
6153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
6163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
6173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
6183239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
6193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
6223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
6233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
6243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
6253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
627ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
628ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
629ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
630ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
631ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6325c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
6333e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
634ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
635ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
6363e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
637ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
638ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
639ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
640ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
641ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
642ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
643ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
644ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6453e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
646ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
647ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
6483e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
649ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
6503e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kMem);
651ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
6523e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
653ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
654ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
655ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
656ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
657ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
658ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
659ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
660ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
661ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
662ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Error error;
6633ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  ScopedMockLog log;
664ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AddEndpoint(ap);
665ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AutoConnect();
666ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_FALSE(wifi()->IsIdle());
667ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
668ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6693e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
670ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_FALSE(wifi()->IsIdle());
6713ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
6723ab56acd3681faabdee8d09b8441aea76bf81945mukesh agrawal  EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
673ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
6743e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
675ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
676ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
677ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
679d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
681e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
683e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
685e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
687e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
688e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
689e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
690e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
691e41a72d0737488d561a4158019409d5785dad61bThieu Le
692e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
693e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
694e41a72d0737488d561a4158019409d5785dad61bThieu Le
695e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
696e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
697e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
698e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
699e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
700e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
701e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
702e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
703e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
704e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
705e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
706e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
7073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
710d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
711d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
712d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
7133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
714e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
7153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
716e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
7173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
718e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
7193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
720e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
721e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
722165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
723165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
724165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, endpoints_by_rpcid.size());
725165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
726165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFi::EndpointMap::const_iterator i;
727165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFiEndpointRefPtr endpoint;
728165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  for (i = endpoints_by_rpcid.begin();
729165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       i != endpoints_by_rpcid.end();
730165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       ++i) {
731165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    if (i->second->bssid_string() == "00:00:00:00:00:00")
732165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal      break;
733165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  }
734165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ASSERT_TRUE(i != endpoints_by_rpcid.end());
735165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(4, i->second->signal_strength());
7363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
7393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
740261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
741261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(3);
742e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
7433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
744e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
7453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
746e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
7473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
748165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, GetServices().size());
749b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
750e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
751e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
752e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
753b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal  EXPECT_EQ(3, GetServices().size());
754b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
755e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
756e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
757e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
758e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetServices().size());
759165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
760165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
761165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingTogether) {
762165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
763261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
764261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  InSequence s;
765261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
766d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
767261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
768e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
769e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
770165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
771165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(1, GetServices().size());
772165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
773165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
774165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
775165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
776261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
777261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
778e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
779e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
780165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
781165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
782165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
783165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
784165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
785165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
786261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
787261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
788e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
789e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
790e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
791165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
792165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
7933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
795261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonExistentBSSRemoved) {
796261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  // Removal of non-existent BSS should not cause a crash.
797261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
798261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
799261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(0, GetServices().size());
800261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
801261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
802e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
803e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with an empty SSID should not cause a crash.
804e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
805e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
806e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
807e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
808e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
809e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
810e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
811e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with a NULL SSID should not cause a crash.
812e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
813e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
814e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
815e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
816e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
817e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
818261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemoved) {
819d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
820261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
821e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
822261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
823261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
824261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
825261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
8268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
827261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
8288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
8298a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
8308a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8318a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
832d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
8338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
834e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8358a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
8368a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss0");
8378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8388a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
8398a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
8408a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss0");
8418a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
8428a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
8438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
845d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
846d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
8478a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
8488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error e;
8508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service =
8518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal      GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
8528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal                      NULL, NULL, true, &e);
8538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
855e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
856e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
8578a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
8588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss");
859261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8608a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
8628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss");
8638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8648a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // Verify expectations now, because WiFi may call UpdateService when
8658a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // WiFi is Stop()-ed (during TearDown()).
8668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Mock::VerifyAndClearExpectations(manager());
867d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
868261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
869261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
870261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
871d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_));
872d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
873d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_));
874261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
875e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
876e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
877261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
878261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
879261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
880261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
881261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
882261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
883261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
884261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
885261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
886261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
8873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
888d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
889dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
890dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
891dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
8923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
893e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
8953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
8983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
899165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    WiFiService *service(GetServices().begin()->get());
9003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
901dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
9023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
903dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
9043239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    InitiateConnect(service);
905f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    EXPECT_EQ(static_cast<Service *>(service),
906f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal              wifi()->selected_service_.get());
9073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
9083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
9093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
9100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
911d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
9120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
916e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
9190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_FALSE(GetPendingService() == NULL);
9210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
9250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
928d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
929d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
930d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
931d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
936e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
937e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
9380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
9390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
9400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
9420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
9450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
9500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
9520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
9530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
9550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
9560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
959d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
960d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
961d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
962d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
967e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
9700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
9780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
9790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
983d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
984d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
985d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
986d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
991e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
992e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
9930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
9940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
9950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
9970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
10000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
10020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
10030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
10040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
10050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
10060ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
10080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
10090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
10100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
1012d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
10130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
10140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
10150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
1017e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
10180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
10190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
10200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
10210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
10220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
10230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
1025d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1026d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1027d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1028d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
10290ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
10300ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
10310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
1033e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
10340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10350ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
10360ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  DBus::Path fake_path("/fake/path");
10370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
10380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillOnce(Return(fake_path));
10390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
10400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
10410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
10440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
10450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
10460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
10470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
10480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
10490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
10500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
10510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetCurrentService() == NULL);
10530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
10540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10555c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1056d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1057c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1058e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1059c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportScanDone();
10605c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1061c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
1062c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1063b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
10645c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
10655c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
10667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpen) {
10677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1068a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
10697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
10737a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1074a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
10757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
10767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify SSID", e.message());
10777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
10807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
10817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  GetOpenService(
1082a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kTypeWifi, "123456789012345678901234567890123",
1083a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kModeManaged, &e);
10847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10857a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too long", e.message());
10867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10877a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
10897a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1090a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
10917a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10927a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too short", e.message());
10937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
10967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1097a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
10987a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
10997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("service mode is unsupported", e.message());
11007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
11037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1104a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
11057a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSN) {
11097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1110a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1111a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, "secure password", &e);
11127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
1116b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // When configuring hidden networks, Chrome expects to be able to
1117b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // GetService w/o a password, and supply the password with
1118b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // SetProperty afterwards.
11197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1120a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1121a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, NULL, &e);
1122b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11237a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
11267a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1127a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1128a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             NULL, &e);
11297a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
11307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("security mode is unsupported", e.message());
11317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
1134b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // When configuring hidden networks, Chrome expects to be able to
1135b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // GetService w/o a password, and supply the password with
1136b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // SetProperty afterwards.
11377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1138a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1139a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, NULL, &e);
1140b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11437a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
11447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1145a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1146a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "", &e);
11477a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
11517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1152a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1153a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcde", &e);
11547a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
11587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1159a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1160a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcdefghijklm", &e);
11617a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
11657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1166a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1167a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:abcdefghijklm", &e);
11687a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
11727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1173a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1174a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405", &e);
11757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
11797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1180a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1181a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "O102030405", &e);
11827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11857a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
11867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1187a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1188a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:O102030405", &e);
11897a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11907a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11917a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11927a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
11937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1194a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1195a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:0xO102030405", &e);
11967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11977a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11987a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
12007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1201a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1202a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0xO102030405", &e);
12037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
12047a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12057a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
12077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1208a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1209a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
12107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12117a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
12147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1215a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1216a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
12177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
12217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1222a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1223a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
12247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12267a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12277a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
12287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1229a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1230a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
12317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12348ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceSuccessTest : public WiFiMainTest {};
12358ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceFailureTest : public WiFiMainTest {};
12368ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12378ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceSuccessTest, Passphrase) {
12388ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1239a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1240a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
12418ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12428ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
12438ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12448ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceFailureTest, Passphrase) {
12458ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1246a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1247a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
12488ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
12498ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
12508ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12518ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
12528ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTestInstance,
12538ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTest,
12548ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
12558ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
12568ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
12578ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        // subtle: invalid length for hex key, but valid as ascii passphrase
12588ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen-1, '1'),
12598ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen, '1')));
12608ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12618ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
12628ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTestInstance,
12638ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTest,
12648ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
12658ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
12668ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
12678ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen+1, '1')));
12688ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12696ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWEP) {
12706ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12716ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12726ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1273a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12746ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityWep, "abcde", &e);
12756ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12766ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12776ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
12786ab23a9d4526686406d50081853639540b22213aPaul Stewart
1279a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1280a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityWep).get());
1281a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1282a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                           flimflam::kSecurityWpa).get());
12836ab23a9d4526686406d50081853639540b22213aPaul Stewart}
12846ab23a9d4526686406d50081853639540b22213aPaul Stewart
12856ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWPA) {
12866ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12876ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12886ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1289a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12906ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityRsn, "abcdefgh", &e);
12916ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12926ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12936ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1294a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1295a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityWpa));
12966ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(wpa_service.get());
1297a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1298a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityRsn));
12996ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(rsn_service.get());
13006ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), rsn_service.get());
1301a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1302a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityPsk));
13036ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), psk_service.get());
13046ab23a9d4526686406d50081853639540b22213aPaul Stewart  // Indirectly test FindService by doing a GetService on something that
13056ab23a9d4526686406d50081853639540b22213aPaul Stewart  // already exists.
13066ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
13076ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
13086ab23a9d4526686406d50081853639540b22213aPaul Stewart    WiFiServiceRefPtr wpa_service2(
1309a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1310a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        flimflam::kModeManaged, flimflam::kSecurityWpa,
1311a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        "abcdefgh", false, &e));
13126ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
13136ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_EQ(wpa_service.get(), wpa_service2.get());
13146ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
13156ab23a9d4526686406d50081853639540b22213aPaul Stewart}
13166ab23a9d4526686406d50081853639540b22213aPaul Stewart
1317cb59fed9326dc91c93b817dcd9eaca363d8313fePaul StewartTEST_F(WiFiMainTest, GetServiceWithGUID) {
1318cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  // Perform a GetService that also configures properties in the base Service
1319cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  // class using Service::Configure().
1320cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  KeyValueStore args;
1321cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1322cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kSSIDProperty, "ssid");
1323cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1324cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  const string kGUID = "aguid";  // Stored as a registered Service property.
1325cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kGuidProperty, kGUID);
1326cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  Error e;
1327cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1328cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  EXPECT_TRUE(e.IsSuccess());
1329cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  EXPECT_EQ(kGUID, service->guid());
1330cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart}
1331cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
1332ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
1333a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
1334ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
1335ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1336ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1337ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1338ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1339ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1340ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1341ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1342ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1343ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1344ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1345ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
1346ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  return ssids.size() == 2 &&
1347ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      string(ssids[0].begin(), ssids[0].end()) == ssid &&
1348ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      ssids[1].empty();
1349ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1350ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1351ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
1352ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1353ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1354ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .Times(AnyNumber())
1355ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .WillRepeatedly(Throw(
1356ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart          DBus::Error(
1357ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "fi.w1.wpa_supplicant1.InterfaceUnknown",
1358ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
135910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  scoped_refptr<MockProfile> profile(
136010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart      new NiceMock<MockProfile>(control_interface(), manager(), ""));
1361a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
136210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a hidden service with an associated profile.
1363a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1364a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1365a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1366a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1367a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1368a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
136910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    service->set_profile(profile);
1370a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1371a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
137210ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a hidden service without an associated profile.
1373a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1374a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1375a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1376a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1377a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1378a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
1379a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1380a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
138110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a non-hidden service with an associated profile.
1382a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1383a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1384a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1385a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, false, &e);
1386a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1387a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_FALSE(service->hidden_ssid());
138810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    service->set_profile(profile);
1389a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1390a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
1391ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
1392ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1393ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1394ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
13957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
13967ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
13977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
14007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
14017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
14027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
14037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
14057ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
14067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
14077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
14087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1409cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
14107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
14117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
14127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
14137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
14147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1416d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
14177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
14197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
14207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
14217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1422d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1423d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
14247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
14257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
1426cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1427d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
14287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
14297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
14317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
14327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
14337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
14347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1436d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
14377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1439a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1440a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1441a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1442a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(set<string>()));
1443a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1444a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1445a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1446a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1447a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1448a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1449a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1450a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "Hidden" property.
1451a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1452a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1453a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1454a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1455a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1456a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1457a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1458a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1459a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1460a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // "Hidden" property set to "false".
1461a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1462a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1463a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1464a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1465a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1466a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1467a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1468a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1469a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1470a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "SSID" property.
1471a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1472a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1473a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1474a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1475a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1476a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1477a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1478a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1479a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1480a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1481a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  Error e;
1482a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1483a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  ASSERT_TRUE(e.IsSuccess());
1484a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1485a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1486a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1487a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1488d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1489a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1490a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string ssid("an_ssid");
1491a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1492a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, ssid, &id);
1493a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(LoadHiddenServices(&storage));
1494a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1495a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1496a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityNone).get());
1497a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1498a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
14991590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1500d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1501d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1502d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1503d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
15041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
15061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
15081590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
15091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
15101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1512e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
15131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15141590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
15151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetPendingService().get());
15161590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
15181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
15201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetCurrentService().get());
15211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
15221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15231590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1524568b5c6b093d5605a40216711d3291376394dd0fmukesh agrawal  EXPECT_EQ(Service::kStateIdle, service->state());
1525568b5c6b093d5605a40216711d3291376394dd0fmukesh agrawal  EXPECT_TRUE(service->IsFailed());
15261590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
15271590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
15281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15301590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1531d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1532d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1533d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1534d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
15351590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15361590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
15371590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
15381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
15391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handles used in this test ("ap1", "ap2") are
15411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // not intended to reflect the format used by supplicant. They're
15421590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // just convenient for testing.
15431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1545e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
15461590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
1547e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
15481590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service1);
15501590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap1");
15511590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service1.get(), GetCurrentService().get());
15531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1554c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1555c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1556c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1557c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
15581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap2");
15591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service2.get(), GetCurrentService().get());
15611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateIdle, service1->state());
15621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service2->state());
15631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15651590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1566d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1567d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1568d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1569d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
15701590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
15721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
15741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
15751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
15761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1578e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
15791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
15811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
15821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service.get(), GetCurrentService().get());
15841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
15851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15861590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1587e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1588b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1589b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1590b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1591b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1592e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency1 = 2412;
1593e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency2 = 2442;
1594e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
1595e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1596e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1597e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1598e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1599e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(1, GetServices().size());
1600e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiService *service(GetServices()[0].get());
1601e41a72d0737488d561a4158019409d5785dad61bThieu Le  InitiateConnect(service);
1602e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss1");
1603e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency1, service->frequency_);
1604e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss2");
1605e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency2, service->frequency_);
1606e41a72d0737488d561a4158019409d5785dad61bThieu Le}
1607e41a72d0737488d561a4158019409d5785dad61bThieu Le
16084eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawalTEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
16094eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  Error e;
16104eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
16114eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .Times(0);
16124eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), HasService(_))
16134eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .WillOnce(Return(false));
16144eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
16154eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
1616e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
16174eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal            kNetworkModeInfrastructure);
16184eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
16194eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
16208a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1621d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1622d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
16238a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
16248a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
16258a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
16268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
16278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16288a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
1629e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
16308a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
1631e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
16328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
16338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service1);
16348a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service1.get(), GetPendingService().get());
16358a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16368a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16378a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
16388a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service2);
16398a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service2.get(), GetPendingService().get());
16408a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16418a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16428a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
16438a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
16448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
16458a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16468a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
16478a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
16488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error error;
16498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AddEndpoint(ap);
16508a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AutoConnect();
16518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
16528a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16544d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalMATCHER(WiFiAddedArgs, "") {
16554d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
16564d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
16574d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
16584d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
16594d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
1660d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
16614d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
16624d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      *supplicant_interface_proxy_;
16634d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
16644d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
1665e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
16664d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  WiFiService *service(GetServices().begin()->get());
16674d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
16684d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
16694d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
16704d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1671c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1672c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1673cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1674c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1675c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1676c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1677c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1678c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1679c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1680c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1682d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
1683c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1684c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1685c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompleted) {
1686d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1687d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1688d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1689c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1690c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1691c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1692c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1693e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1694c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1695c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1696c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1697c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1698c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1699c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1700c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
1701c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1702c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1703c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1704d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1705d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1706d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1707d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
1708d408fdf69489e3199c63796a06f7cfbbb4513515Paul Stewart  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
1709d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1710ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
1711c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1712c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1713c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1714c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1715e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1716c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1717c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1718c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1719c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1720c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportIPConfigComplete();
1721c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1722c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1723c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1724c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1725c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1726c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
172766c8600f8410ed205701921d58d9e2c00000047cPaul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
172866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
172966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      *supplicant_interface_proxy_;
173066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
173166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  StartWiFi();
173266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
173366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure call to the proxy is deferred.
173466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
173566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
173666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
173766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
173866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
173966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
174066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
174166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
174266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
174366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
174466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
174566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
174666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
174766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
174866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
174966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
175066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
175166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
175266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
175366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure multiple calls to ClearCachedCredentials() results in only
175466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // one call to the proxy.
175566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
175666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
175766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
175866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart}
175966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
1760b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1761b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1762b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1763b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
1764b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
1765b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1766b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1767b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1768b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1769b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1770b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1771b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1772b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1773b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
1774b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1775b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1776b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
1777b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1778b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
1779b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1780b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1781b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  RemoveBSS("bss0");
1782b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
1783b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
1784b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
1785b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1786b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
17875c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
17885c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
17895c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
17905c05b2920be742d518829972127172481722058dmukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
17915c05b2920be742d518829972127172481722058dmukesh agrawal      *supplicant_interface_proxy_;
17925c05b2920be742d518829972127172481722058dmukesh agrawal
17935c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
17945c05b2920be742d518829972127172481722058dmukesh agrawal
17955c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
17965c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
17975c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
17985c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(supplicant_interface_proxy,
17995c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
18003e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
18015c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
18025c05b2920be742d518829972127172481722058dmukesh agrawal}
18035c05b2920be742d518829972127172481722058dmukesh agrawal
1804b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerIdle) {
1805b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1806b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1807b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1808b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1809b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1812b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1813b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1814b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1815b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1816b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1817b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
1818b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1819b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1820b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1821b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1822b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1823b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
1824b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
1825b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1826b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1827b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1828b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1829b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1830b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1831b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
1832b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1833b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1834b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1835b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1836b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiService *service(GetServices().begin()->get());
1837b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1838b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1839b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1840b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1841b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1842b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1843b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1844b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1845b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1846b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1847b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
1848b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1849b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1850b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1851b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1852b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(1);
1853b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1854b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1855b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1856b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1857b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1858b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1859b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1860b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1861b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1862b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1863b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1864b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1865b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1866b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1867b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1868b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1869b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(0);
1870b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1871b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1872b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1873b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1874b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  Error e;
1875b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  scoped_refptr<MockProfile> profile(
1876b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal      new NiceMock<MockProfile>(control_interface(), manager(), ""));
1877b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr hidden_service =
1878b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal      GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
1879b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal                      flimflam::kModeManaged, NULL, NULL, true, &e);
1880b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  hidden_service->set_profile(profile);
1881b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1882b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1883b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1884b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1885b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1886b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal            kNetworkModeInfrastructure);
1887b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1888b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged("an_ap");
1889b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1890b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1891b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1892b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1893b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal              Scan(HasHiddenSSID("hidden_ssid")));
1894b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1895b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1896b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1897b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1898b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1899b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1900b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1901b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1902b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1903b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal            kNetworkModeInfrastructure);
1904b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1905b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged("an_ap");
1906b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1907b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1908b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1909b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1910b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1911b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1912b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1913b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1914cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsOpen) {
1915cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  Error e;
1916cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  WiFiServiceRefPtr service = GetOpenService(
1917cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal      flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1918cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1919cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
1920cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1921cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1922cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1923cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
1924cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  Error e;
1925cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  WiFiServiceRefPtr service =
1926cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal      GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1927cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                 flimflam::kSecurityWpa, "abcdefgh", &e);
1928cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1929cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
1930cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_TRUE(wifi()->SuspectCredentials(*service));
1931cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1932cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1933cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
1934cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  Error e;
1935cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  WiFiServiceRefPtr service =
1936cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal      GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1937cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal                 flimflam::kSecurityWpa, "abcdefgh", &e);
1938cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1939cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  service->has_ever_connected_ = true;
1940cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1941cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1942cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1943cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawalTEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
1944cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ScopedMockLog log;
1945cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  Error e;
1946cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1947cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  SetPendingService(service);
1948cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1949cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_FALSE(service->has_ever_connected());
1950cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1951cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(*service, SetFailure(Service::kFailureBadCredentials));
1952cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1953cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
1954cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1955cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_EQ(Service::kStateIdle, service->state());
1956cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal  EXPECT_TRUE(service->IsFailed());
1957cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal}
1958cf24a2465a3e7b5a11fa97be282f0af47aa3ef6emukesh agrawal
1959bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
1960e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// Scanning tests will use a mock of the event dispatcher instead of a real
1961e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart// one.
1962e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartclass WiFiScanTest : public WiFiObjectTest {
1963e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart public:
1964e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  WiFiScanTest() : WiFiObjectTest(&mock_dispatcher_) {}
1965e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1966e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart protected:
1967e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  void ExpectInitialScanSequence();
1968e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1969e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StrictMock<MockEventDispatcher> mock_dispatcher_;
1970e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart};
1971e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1972e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewartvoid WiFiScanTest::ExpectInitialScanSequence() {
1973e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Choose a number of iterations some multiple higher than the fast scan
1974e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // count.
1975e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
1976e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1977e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // Each time we call FireScanTimer() below, WiFi will post a task to actually
1978e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // run Scan() on the wpa_supplicant proxy.
1979e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_))
1980e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .Times(kScanTimes);
1981e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  {
1982e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    InSequence seq;
1983e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // The scans immediately after the initial scan should happen at the short
1984e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // interval.  If we add the initial scan (not invoked in this function) to
1985e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
1986e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // the fast scan interval.
1987e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1988e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, WiFi::kFastScanIntervalSeconds * 1000))
1989e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(WiFi::kNumFastScanAttempts - 1)
1990e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1991e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1992e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    // After this, the WiFi device should use the normal scan interval.
1993e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1994e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        _, GetScanInterval() * 1000))
1995e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
1996e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart        .WillRepeatedly(Return(true));
1997e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
1998e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    for (int i = 0; i < kScanTimes; i++) {
1999e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      FireScanTimer();
2000e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart    }
2001e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  }
2002e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2003e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2004e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul StewartTEST_F(WiFiScanTest, FastRescan) {
2005e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // This PostTask is a result of the call to Scan(NULL), and is meant to
2006e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // post a task to call Scan() on the wpa_supplicant proxy immediately.
2007e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostTask(_));
2008e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2009e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2010e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2011e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  StartWiFi();
2012e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2013e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2014e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2015e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  // If we end up disconnecting, the sequence should repeat.
2016e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2017e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      _, WiFi::kFastScanIntervalSeconds * 1000))
2018e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart      .WillOnce(Return(true));
2019e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  RestartFastScanAttempts();
2020e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2021e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart  ExpectInitialScanSequence();
2022e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart}
2023e369ecef65c622f0f6aaf3012e4ae392a378ee1cPaul Stewart
2024bc6e7390c4401e171ede4dc83b79b316f3e71100Paul StewartTEST_F(WiFiMainTest, EAPCertification) {
2025bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2026bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2027bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2028bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ScopedMockLog log;
2029bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2030bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  map<string, ::DBus::Variant> args;
2031bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2032bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2033bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2034bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  SetCurrentService(service);
2035bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2036bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2037bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2038bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2039bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const uint32 kDepth = 123;
2040bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2041bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2042bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(log,
2043bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart              Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2044bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2045bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  Mock::VerifyAndClearExpectations(&log);
2046bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2047bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  const string kSubject("subject");
2048bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  args[wpa_supplicant::kInterfacePropertySubject].writer()
2049bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart      .append_string(kSubject.c_str());
2050bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2051bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart  ReportCertification(args);
2052bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart}
2053bc6e7390c4401e171ede4dc83b79b316f3e71100Paul Stewart
2054853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
2055