wifi_unittest.cc revision b66c646facf31a901629c1bc7da15b9c7d7d88c0
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"
362ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
373426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
38ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain#include "shill/mock_power_manager.h"
39ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain#include "shill/mock_power_manager_proxy.h"
4010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart#include "shill/mock_profile.h"
415c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
42a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
43b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
465c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
48dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
49853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
53ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
54853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
55ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
56853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
57a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing std::set;
58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
60853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
63a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
65b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
67dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
69ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
70a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
71a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
72a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
73853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
758ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
823426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
833426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                         NULL, NULL, NULL, "wifi", "", 0)) {
84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
86853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
87853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
888abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
89853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
92de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
93de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
95853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
966bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
97a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
98a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
996bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
100de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
101a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
102a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
103a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
104a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
105a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
106a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1076bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1096bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1106bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
111a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
112853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
113a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
114a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1156bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1166bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1176bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1186bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
1199d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
120a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
121853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1246bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal            wpa_supplicant::kNetworkBgscanMethodSimple),
1294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1346bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1404d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1414d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1428abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawalTEST_F(WiFiPropertyTest, ClearDerivedProperty) {
1438abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
1448abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1458abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1468abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1478abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1486bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1498abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1508abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1518abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1528abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal          wpa_supplicant::kNetworkBgscanMethodLearn),
1538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
1558abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1568abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
1578abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
1588abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1598abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
1608abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1618ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiMainTest : public ::testing::TestWithParam<string> {
1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
1633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiMainTest()
1643426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : manager_(&control_interface_, NULL, &metrics_, &glib_),
165c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
166626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
1673239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal                       &dispatcher_,
1683426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
169626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
170626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
171626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
172626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
173dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
174dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
175dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
176b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
177b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
178f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
179f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dispatcher_,
180f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dhcp_provider_,
181f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        kDeviceName,
182d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewart                                        kHostName,
183f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &glib_)),
184ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        proxy_factory_(this),
1853e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood        power_manager_(new MockPowerManager(&proxy_factory_)) {
1863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
1874eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // Except for WiFiServices created via WiFi::GetService, we expect
1884eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // that any WiFiService has been registered with the Manager. So
1894eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // default Manager.HasService to true, to make the common case
1904eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    // easy.
1914eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal    ON_CALL(manager_, HasService(_)).
1924eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal        WillByDefault(Return(true));
193c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
194c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(dhcp_provider_, CreateConfig(_, _)).
195c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(dhcp_config_));
196c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(*dhcp_config_.get(), RequestIP()).
197c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(true));
198ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
199ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    // |manager_| takes ownership of |power_manager_|.
200ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    manager_.set_power_manager(power_manager_);
2015c05b2920be742d518829972127172481722058dmukesh agrawal
2025c05b2920be742d518829972127172481722058dmukesh agrawal    wifi_->time_ = &time_;
2033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2045c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
206ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
2075c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
2085c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
209c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal    ON_CALL(manager_, device_info()).
210c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        WillByDefault(Return(&device_info_));
211b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone    EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
212b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2135c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
2145c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
2155c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
216d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
217910011207d66e14bf753d2783e131e7558126430Gary Morain    EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
218910011207d66e14bf753d2783e131e7558126430Gary Morain        .Times(AnyNumber());
2199a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->SelectService(NULL);
220b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
221b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
222b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
223ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2279a24553461df7036755060423f90804011612249Eric Shienbrood    wifi_->Stop(NULL, ResultCallback());
2285c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
229f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
230f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
2313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
2337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
2353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
236b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    explicit TestProxyFactory(WiFiMainTest *test);
2373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
2391830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
240dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
2441830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const WiFiRefPtr &/*wifi*/,
2451830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
2461830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
247dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
250b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
251b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
252b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
253b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
254b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
255b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
256ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
257ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        PowerManagerProxyDelegate */*delegate*/) {
258ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain      return new MockPowerManagerProxy();
259ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    }
260ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
2613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
262b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
263b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
264b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
265b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
266b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
267b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
268b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
269dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    WiFiMainTest *test_;
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
272b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void CancelScanTimer() {
273b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->scan_timer_callback_.Cancel();
274b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
2751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
2761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    bool hidden_ssid = false;
2771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
2781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
279b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void FireScanTimer() {
280b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->ScanTimerHandler();
281b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
2821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
2831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
2841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
2853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
286165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
2873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
2891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
2901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
291b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  const base::CancelableClosure &GetScanTimer() {
292b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    return wifi_->scan_timer_callback_;
293b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
294165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const vector<WiFiServiceRefPtr> &GetServices() {
295165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->services_;
2963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
2983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // proxies instantiated by WiFiMainTest), to ensure that WiFi
2993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
3003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
3013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3038a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
3048a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
3058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
3063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
3087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
3097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
3107ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void InitiateConnect(WiFiServiceRefPtr service) {
3116e277774580c52073c919c4cbebedae27861d845mukesh agrawal    map<string, ::DBus::Variant> params;
3126e277774580c52073c919c4cbebedae27861d845mukesh agrawal    wifi_->ConnectTo(service, params);
3133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  void InitiateDisconnect(WiFiServiceRefPtr service) {
3150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal    wifi_->DisconnectFrom(service);
3160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  }
3171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
318e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal    return WiFiEndpoint::MakeOpenEndpoint(
319e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal        &proxy_factory_, NULL, ssid, bssid, 0, 0);
3201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
3217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr MakeMockService() {
3227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    vector<uint8_t> ssid(1, 'a');
3237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return new MockWiFiService(
3247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &control_interface_,
3257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &dispatcher_,
3263426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le        &metrics_,
3277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &manager_,
3287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        wifi_,
3297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        ssid,
3307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kModeManaged,
3317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kSecurityNone,
3327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        false);
3337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
334261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
3353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
3363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
3373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
3383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
339e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
3403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
34166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  void ClearCachedCredentials() {
34266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart    wifi_->ClearCachedCredentials();
34366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  }
344c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
34579d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
346c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
347f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
348f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
349f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
3503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
351dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
3523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
3541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
3551590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
3567ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
3577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
3587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
359b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  void SetScanInterval(uint16_t interval_seconds) {
360b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetScanInterval(interval_seconds, NULL);
361b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  }
3623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
363ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
364ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        .WillOnce(SaveArg<1>(&power_state_callback_));
365b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(true);  // Start(NULL, ResultCallback());
3663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
368910011207d66e14bf753d2783e131e7558126430Gary Morain    EXPECT_CALL(*power_manager_,
369910011207d66e14bf753d2783e131e7558126430Gary Morain                RemoveStateChangeCallback(wifi_->UniqueName()));
370b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal    wifi_->SetEnabled(false);  // Stop(NULL, ResultCallback());
3713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
372ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  void GetOpenService(const char *service_type,
3737a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *ssid,
3747a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *mode,
375ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                      Error *result) {
376ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
3777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
3787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  void GetService(const char *service_type,
3797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *ssid,
3807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *mode,
3817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *security,
3827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *passphrase,
383ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                  Error *result) {
384ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, security, passphrase, false,
385ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                    result);
386ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
387ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  WiFiServiceRefPtr GetServiceInner(const char *service_type,
388ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *ssid,
389ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *mode,
390ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *security,
391ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *passphrase,
392a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                    bool allow_hidden,
393ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    Error *result) {
3947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    map<string, ::DBus::Variant> args;
3957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // in general, we want to avoid D-Bus specific code for any RPCs
3967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // that come in via adaptors. we make an exception here, because
3977a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // calls to GetWifiService are rerouted from the Manager object to
3987a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // the Wifi class.
3997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (service_type != NULL)
4007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kTypeProperty].writer().append_string(service_type);
4017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (ssid != NULL)
4027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSSIDProperty].writer().append_string(ssid);
4037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (mode != NULL)
4047a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kModeProperty].writer().append_string(mode);
4057a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (security != NULL)
4067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSecurityProperty].writer().append_string(security);
4077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (passphrase != NULL)
4087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
409a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    if (!allow_hidden)
410a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
4117a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
412ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    Error e;
413ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    KeyValueStore args_kv;
4147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
415ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return wifi_->GetService(args_kv, result);
4167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
417cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
418cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
419cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart                                            Error *result) {
420cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart    return wifi_->GetService(args, result);
421cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  }
422cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
423a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
424a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &mode,
425a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &security) {
426a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->FindService(ssid, mode, security);
427a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
428a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  bool LoadHiddenServices(StoreInterface *storage) {
429a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->LoadHiddenServices(storage);
430a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
431a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
432a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
433a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
434a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kTypeWifi,
435a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                kDeviceAddress,
436a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                hex_ssid.c_str(),
437a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kModeManaged,
438a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kSecurityNone));
439a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const char *groups[] = { id->c_str() };
440a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
441a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(Return(set<string>(groups, groups + 1)));
442a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
443a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
444a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
445a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
446a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
44710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
44810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  NiceMockControl *control_interface() {
44910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    return &control_interface_;
45010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  }
45110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart
4523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
4533239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
4543239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
455d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
456d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
457d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
458d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
459d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
460d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
461d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
462d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
463d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
4643e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  const PowerManager::PowerStateCallback &power_state_callback() const {
465ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    return power_state_callback_;
466ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  }
467ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
4683239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
4693239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
4703239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
4713239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
472b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
473b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
474b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
475b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
4763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  EventDispatcher dispatcher_;
4775c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
4785c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
4793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
481dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
4823426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
483f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
4842ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
485c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
4863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
4873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
4893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
4903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
4913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
492626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
493d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewart  static const char kHostName[];
4943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
4953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
4963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
497dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
498dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
499b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
500f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
501f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
5023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
5043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
505ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  MockPowerManager *power_manager_;
5063e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  PowerManager::PowerStateCallback power_state_callback_;
5073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
5083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0";
510a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartconst char WiFiMainTest::kDeviceAddress[] = "000102030405";
511d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewartconst char WiFiMainTest::kHostName[] = "hostname";
5123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
5133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
5143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
515261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalvoid WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
516b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
517261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
518261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
5193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
5203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
5213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
5223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
523e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
5243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
5253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
5263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
5293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
5303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
5333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
5343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
5353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
5363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
5383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
5393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
540e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
541e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
542e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
543e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
544e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
545b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
5463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
548b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalWiFiMainTest::TestProxyFactory::TestProxyFactory(WiFiMainTest *test)
549b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
550b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
551b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
552b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
553b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
554b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
555b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
5563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
5573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
5583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
5593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
5623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
5633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
5663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
5673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
5683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
5693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
5703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
5713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
5723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
5733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
574b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
5753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5763239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
577b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
5783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
5813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
5823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
5833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
5843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
5853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
5863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
5873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
5883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
5893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5903239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
5913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
5943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
5953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
5963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
599ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
600ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
601ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
602ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
603ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6045c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
6053e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
606ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
607ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
6083e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
609ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
610ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
611ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
612ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
613ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
614ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
615ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
616ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6173e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
618ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
619ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
6203e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
621ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
6223e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kMem);
623ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
6243e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
625ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
626ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
627ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
628ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
629ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
630ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
631ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
632ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
633ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
634ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Error error;
635ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AddEndpoint(ap);
636ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AutoConnect();
637ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_FALSE(wifi()->IsIdle());
638ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
639ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
6403e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  ASSERT_FALSE(power_state_callback().is_null());
641ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_FALSE(wifi()->IsIdle());
642ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
6433e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
644ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
645ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
646ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
6473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
648d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
6493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
650e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
652e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
654e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
656e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
657e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
658e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
659e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
660e41a72d0737488d561a4158019409d5785dad61bThieu Le
661e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
662e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
663e41a72d0737488d561a4158019409d5785dad61bThieu Le
664e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
665e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
666e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
667e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
668e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
669e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
670e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
671e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
672e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
673e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
674e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
675e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
6763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
679d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
680d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
681d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
6823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
683e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
685e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
687e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
689e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
690e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
691165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
692165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
693165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, endpoints_by_rpcid.size());
694165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
695165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFi::EndpointMap::const_iterator i;
696165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFiEndpointRefPtr endpoint;
697165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  for (i = endpoints_by_rpcid.begin();
698165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       i != endpoints_by_rpcid.end();
699165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       ++i) {
700165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    if (i->second->bssid_string() == "00:00:00:00:00:00")
701165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal      break;
702165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  }
703165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ASSERT_TRUE(i != endpoints_by_rpcid.end());
704165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(4, i->second->signal_strength());
7053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
7073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
7083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
709261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
710261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(3);
711e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
7123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
713e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
7143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
715e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
7163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
717165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, GetServices().size());
718b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
719e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
720e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
721e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
722b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal  EXPECT_EQ(3, GetServices().size());
723b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
724e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
725e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
726e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
727e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetServices().size());
728165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
729165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
730165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingTogether) {
731165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
732261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
733261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  InSequence s;
734261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
735d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
736261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
737e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
738e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
739165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
740165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(1, GetServices().size());
741165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
742165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
743165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
744165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
745261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
746261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
747e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
748e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
749165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
750165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
751165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
752165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
753165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
754165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
755261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
756261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
757e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
758e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
759e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
760165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
761165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
7623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
764261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonExistentBSSRemoved) {
765261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  // Removal of non-existent BSS should not cause a crash.
766261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
767261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
768261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(0, GetServices().size());
769261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
770261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
771e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
772e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with an empty SSID should not cause a crash.
773e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
774e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
775e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
776e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
777e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
778e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
779e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
780e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with a NULL SSID should not cause a crash.
781e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
782e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
783e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
784e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
785e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
786e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
787261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemoved) {
788d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
789261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
790e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
791261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
792261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
793261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
794261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
7958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
796261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
7978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
7988a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
7998a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8008a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
801d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
8028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
803e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8048a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
8058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss0");
8068a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
8088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
8098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss0");
8108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
8118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
8128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
814d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
815d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
8168a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
8178a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error e;
8198a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service =
8208a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal      GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
8218a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal                      NULL, NULL, true, &e);
8228a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8238a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
824e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
825e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
8268a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
8278a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss");
828261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8298a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8308a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
8318a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss");
8328a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8338a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // Verify expectations now, because WiFi may call UpdateService when
8348a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // WiFi is Stop()-ed (during TearDown()).
8358a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Mock::VerifyAndClearExpectations(manager());
836d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
837261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
838261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
839261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
840d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_));
841d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
842d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_));
843261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
844e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
845e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
846261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
847261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
848261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
849261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
850261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
851261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
852261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
853261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
854261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
855261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
8563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
857d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
858dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
859dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
860dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
8613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
862e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
8643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
8673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
868165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    WiFiService *service(GetServices().begin()->get());
8693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
870dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
8713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
872dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
8733239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    InitiateConnect(service);
874f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    EXPECT_EQ(static_cast<Service *>(service),
875f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal              wifi()->selected_service_.get());
8763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
8773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
880d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
8810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
8820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
8830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
885e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
8870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
8880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_FALSE(GetPendingService() == NULL);
8900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
8910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
8920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
8940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
8950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
897d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
898d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
899d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
900d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
905e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
906e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
9070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
9080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
9090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
9110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
9140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
9190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
9210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
9220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
9240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
9250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9270ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
928d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
929d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  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);
9370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
9390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
9470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
9480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
952d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
953d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
954d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
955d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
960e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
961e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
9620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
9630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
9640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
9660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
9690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9720ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
9730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
9740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
9750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
981d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
9820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
986e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
9890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
9900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
994d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
995d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
996d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
997d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
10000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
1002e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
10030ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
10050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  DBus::Path fake_path("/fake/path");
10060ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
10070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillOnce(Return(fake_path));
10080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
10090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
10100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10110ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
10130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
10140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
10150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
10160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
10170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
10180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
10190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
10200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetCurrentService() == NULL);
10220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
10230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
10245c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1025d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1026c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1027e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1028c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportScanDone();
10295c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1030c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
1031c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
1032b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
10335c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
10345c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
10357a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpen) {
10367a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1037a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
10387a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10397a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10407a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
10427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1043a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
10447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
10457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify SSID", e.message());
10467a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10477a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
10497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
10507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  GetOpenService(
1051a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kTypeWifi, "123456789012345678901234567890123",
1052a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kModeManaged, &e);
10537a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10547a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too long", e.message());
10557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
10587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1059a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
10607a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10617a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too short", e.message());
10627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
10657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1066a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
10677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
10687a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("service mode is unsupported", e.message());
10697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
10727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1073a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
10747a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSN) {
10787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1079a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1080a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, "secure password", &e);
10817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
1085b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // When configuring hidden networks, Chrome expects to be able to
1086b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // GetService w/o a password, and supply the password with
1087b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // SetProperty afterwards.
10887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1089a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1090a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, NULL, &e);
1091b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10927a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
10957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1096a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1097a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             NULL, &e);
10987a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
10997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("security mode is unsupported", e.message());
11007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
1103b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // When configuring hidden networks, Chrome expects to be able to
1104b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // GetService w/o a password, and supply the password with
1105b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  // SetProperty afterwards.
11067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1107a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1108a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, NULL, &e);
1109b172e4a6b35588728f17008e3510eebff95cc38cmukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11117a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
11137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1114a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1115a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "", &e);
11167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
11207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1121a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1122a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcde", &e);
11237a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11267a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
11277a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1128a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1129a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcdefghijklm", &e);
11307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
11347a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1135a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1136a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:abcdefghijklm", &e);
11377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11387a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11397a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11407a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
11417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1142a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1143a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405", &e);
11447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11467a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11477a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
11487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1149a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1150a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "O102030405", &e);
11517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11527a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11537a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11547a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
11557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1156a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1157a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:O102030405", &e);
11587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11597a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11607a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11617a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
11627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1163a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1164a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:0xO102030405", &e);
11657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11687a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
11697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1170a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1171a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0xO102030405", &e);
11727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11737a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11747a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
11767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1177a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1178a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
11797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
11837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1184a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1185a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
11867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11877a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11897a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
11907a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1191a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1192a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
11937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
11977a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1198a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1199a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
12007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
12027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
12038ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceSuccessTest : public WiFiMainTest {};
12048ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceFailureTest : public WiFiMainTest {};
12058ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12068ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceSuccessTest, Passphrase) {
12078ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1208a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1209a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
12108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
12118ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
12128ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12138ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceFailureTest, Passphrase) {
12148ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1215a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1216a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
12178ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
12188ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
12198ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12208ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
12218ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTestInstance,
12228ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTest,
12238ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
12248ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
12258ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
12268ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        // subtle: invalid length for hex key, but valid as ascii passphrase
12278ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen-1, '1'),
12288ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen, '1')));
12298ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12308ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
12318ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTestInstance,
12328ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTest,
12338ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
12348ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
12358ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
12368ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen+1, '1')));
12378ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12386ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWEP) {
12396ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12406ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12416ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1242a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12436ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityWep, "abcde", &e);
12446ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12456ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12466ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
12476ab23a9d4526686406d50081853639540b22213aPaul Stewart
1248a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1249a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityWep).get());
1250a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1251a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                           flimflam::kSecurityWpa).get());
12526ab23a9d4526686406d50081853639540b22213aPaul Stewart}
12536ab23a9d4526686406d50081853639540b22213aPaul Stewart
12546ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWPA) {
12556ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12566ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12576ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1258a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12596ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityRsn, "abcdefgh", &e);
12606ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12616ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12626ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1263a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1264a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityWpa));
12656ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(wpa_service.get());
1266a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1267a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityRsn));
12686ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(rsn_service.get());
12696ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), rsn_service.get());
1270a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1271a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityPsk));
12726ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), psk_service.get());
12736ab23a9d4526686406d50081853639540b22213aPaul Stewart  // Indirectly test FindService by doing a GetService on something that
12746ab23a9d4526686406d50081853639540b22213aPaul Stewart  // already exists.
12756ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12766ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
12776ab23a9d4526686406d50081853639540b22213aPaul Stewart    WiFiServiceRefPtr wpa_service2(
1278a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1279a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        flimflam::kModeManaged, flimflam::kSecurityWpa,
1280a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        "abcdefgh", false, &e));
12816ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12826ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_EQ(wpa_service.get(), wpa_service2.get());
12836ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12846ab23a9d4526686406d50081853639540b22213aPaul Stewart}
12856ab23a9d4526686406d50081853639540b22213aPaul Stewart
1286cb59fed9326dc91c93b817dcd9eaca363d8313fePaul StewartTEST_F(WiFiMainTest, GetServiceWithGUID) {
1287cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  // Perform a GetService that also configures properties in the base Service
1288cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  // class using Service::Configure().
1289cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  KeyValueStore args;
1290cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1291cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kSSIDProperty, "ssid");
1292cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1293cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  const string kGUID = "aguid";  // Stored as a registered Service property.
1294cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  args.SetString(flimflam::kGuidProperty, kGUID);
1295cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  Error e;
1296cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1297cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  EXPECT_TRUE(e.IsSuccess());
1298cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart  EXPECT_EQ(kGUID, service->guid());
1299cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart}
1300cb59fed9326dc91c93b817dcd9eaca363d8313fePaul Stewart
1301ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
1302a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
1303ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
1304ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1305ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1306ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1307ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1308ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1309ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1310ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1311ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1312ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1313ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1314ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
1315ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  return ssids.size() == 2 &&
1316ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      string(ssids[0].begin(), ssids[0].end()) == ssid &&
1317ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      ssids[1].empty();
1318ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1319ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1320ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
1321ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1322ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1323ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .Times(AnyNumber())
1324ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .WillRepeatedly(Throw(
1325ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart          DBus::Error(
1326ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "fi.w1.wpa_supplicant1.InterfaceUnknown",
1327ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
132810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart  scoped_refptr<MockProfile> profile(
132910ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart      new NiceMock<MockProfile>(control_interface(), manager(), ""));
1330a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
133110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a hidden service with an associated profile.
1332a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1333a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1334a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1335a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1336a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1337a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
133810ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    service->set_profile(profile);
1339a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1340a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
134110ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a hidden service without an associated profile.
1342a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1343a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1344a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1345a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1346a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1347a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
1348a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1349a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
135010ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    // Create a non-hidden service with an associated profile.
1351a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1352a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1353a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1354a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, false, &e);
1355a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1356a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_FALSE(service->hidden_ssid());
135710ccbb3c6bc4f4246105743c8508fc9ce8759c17Paul Stewart    service->set_profile(profile);
1358a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1359a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
1360ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
1361ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1362ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1363ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
13647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
13657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
13667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
13697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
13707ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
13717ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
13727ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13737ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13747ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
13757ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
13767ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13777ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
13787ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
13797ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13807ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
13817ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
13827ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
13837ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
13847ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1385d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
13867ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13877ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13887ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
13897ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
13907ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1391d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1392d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
13937ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13947ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
13957ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
1396d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
13977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
13997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
14007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
14017ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
14027ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
14037ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
14047ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1405d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
14067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
14077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1408a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1409a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1410a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1411a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(set<string>()));
1412a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1413a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1414a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1415a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1416a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1417a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1418a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1419a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "Hidden" property.
1420a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1421a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1422a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1423a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1424a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1425a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1426a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1427a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1428a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1429a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // "Hidden" property set to "false".
1430a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1431a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1432a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1433a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1434a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1435a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1436a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1437a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1438a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1439a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "SSID" property.
1440a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1441a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1442a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1443a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1444a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1445a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1446a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1447a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1448a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1449a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1450a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  Error e;
1451a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1452a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  ASSERT_TRUE(e.IsSuccess());
1453a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1454a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1455a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1456a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1457d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1458a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1459a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string ssid("an_ssid");
1460a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1461a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, ssid, &id);
1462a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(LoadHiddenServices(&storage));
1463a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1464a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1465a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityNone).get());
1466a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1467a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
14681590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1469d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1470d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1471d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1472d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
14731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
14741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
14751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
14771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
14781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
14791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1481e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
14821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
14831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
14841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetPendingService().get());
14851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14861590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
14871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
14891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetCurrentService().get());
14901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1493568b5c6b093d5605a40216711d3291376394dd0fmukesh agrawal  EXPECT_EQ(Service::kStateIdle, service->state());
1494568b5c6b093d5605a40216711d3291376394dd0fmukesh agrawal  EXPECT_TRUE(service->IsFailed());
14951590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
14961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14991590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1500d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1501d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  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 ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
15061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
15071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
15081590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15091590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handles used in this test ("ap1", "ap2") are
15101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // not intended to reflect the format used by supplicant. They're
15111590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // just convenient for testing.
15121590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15131590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1514e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
15151590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
1516e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
15171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service1);
15191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap1");
15201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service1.get(), GetCurrentService().get());
15221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1523c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1524c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1525c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1526c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
15271590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap2");
15281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service2.get(), GetCurrentService().get());
15301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateIdle, service1->state());
15311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service2->state());
15321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15341590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1535d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1536d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1537d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1538d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
15391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
15411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15421590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
15431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
15441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
15451590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
15461590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1547e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
15481590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
15501590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
15511590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service.get(), GetCurrentService().get());
15531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
15541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15551590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1556e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1557b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1558b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1559b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1560b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1561e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency1 = 2412;
1562e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency2 = 2442;
1563e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
1564e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1565e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1566e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1567e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1568e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(1, GetServices().size());
1569e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiService *service(GetServices()[0].get());
1570e41a72d0737488d561a4158019409d5785dad61bThieu Le  InitiateConnect(service);
1571e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss1");
1572e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency1, service->frequency_);
1573e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss2");
1574e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency2, service->frequency_);
1575e41a72d0737488d561a4158019409d5785dad61bThieu Le}
1576e41a72d0737488d561a4158019409d5785dad61bThieu Le
15774eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawalTEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
15784eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  Error e;
15794eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
15804eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .Times(0);
15814eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), HasService(_))
15824eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .WillOnce(Return(false));
15834eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
15844eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
1585e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
15864eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal            kNetworkModeInfrastructure);
15874eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
15884eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
15898a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1590d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1591d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
15928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
15948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
15958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
15968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
1598e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
15998a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
1600e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
16018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
16028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service1);
16038a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service1.get(), GetPendingService().get());
16048a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
16068a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
16078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service2);
16088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service2.get(), GetPendingService().get());
16098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16118a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
16128a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
16138a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
16148a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16158a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
16168a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
16178a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error error;
16188a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AddEndpoint(ap);
16198a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AutoConnect();
16208a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
16218a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
16228a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
16234d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalMATCHER(WiFiAddedArgs, "") {
16244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
16254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
16264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
16274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
16284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
1629d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
16304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
16314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      *supplicant_interface_proxy_;
16324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
16334d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
1634e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
16354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  WiFiService *service(GetServices().begin()->get());
16364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
16374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
16384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
16394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1640c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1641c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1642c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
1643c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1644c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1645c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1646c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1647c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1648c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1649c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1650c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1651d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
1652c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1653c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1654c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompleted) {
1655d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1656d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1657d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1658c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1659c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1660c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1661c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1662e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1663c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1664c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1665c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1666c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1667c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1668c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1669c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
1670c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1671c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1672c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1673d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1674d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1675d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1676d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
1677d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1678d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1679ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
1680c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1681c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1682c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1683c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1684e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1685c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1686c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1687c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1688c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1689c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportIPConfigComplete();
1690c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1691c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1692c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1693c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1694c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1695c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
169666c8600f8410ed205701921d58d9e2c00000047cPaul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
169766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
169866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      *supplicant_interface_proxy_;
169966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
170066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  StartWiFi();
170166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
170266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure call to the proxy is deferred.
170366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
170466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
170566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
170666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
170766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
170866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
170966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
171066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
171166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
171266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
171366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
171466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
171566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
171666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
171766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
171866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
171966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
172066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
172166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
172266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure multiple calls to ClearCachedCredentials() results in only
172366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // one call to the proxy.
172466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
172566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
172666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
172766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart}
172866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
1729b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1730b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1731b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1732b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
1733b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
1734b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1735b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1736b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1737b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1738b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1739b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1740b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1741b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1742b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
1743b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1744b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1745b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
1746b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1747b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
1748b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1749b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1750b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  RemoveBSS("bss0");
1751b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
1752b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
1753b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
1754b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1755b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
17565c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
17575c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
17585c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
17595c05b2920be742d518829972127172481722058dmukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
17605c05b2920be742d518829972127172481722058dmukesh agrawal      *supplicant_interface_proxy_;
17615c05b2920be742d518829972127172481722058dmukesh agrawal
17625c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
17635c05b2920be742d518829972127172481722058dmukesh agrawal
17645c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
17655c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
17665c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
17675c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(supplicant_interface_proxy,
17685c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
17693e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood  power_state_callback().Run(PowerManagerProxyDelegate::kOn);
17705c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
17715c05b2920be742d518829972127172481722058dmukesh agrawal}
17725c05b2920be742d518829972127172481722058dmukesh agrawal
1773b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerIdle) {
1774b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1775b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1776b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1777b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1778b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1779b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1780b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1781b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1782b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1783b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1784b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1785b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1786b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerScanning) {
1787b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1788b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1789b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1790b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1791b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1792b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // Should not call Scan, since we're already scanning.
1793b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  // (Scanning is triggered by StartWiFi.)
1794b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1795b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1796b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1797b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1798b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1799b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1800b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerConnecting) {
1801b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1802b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1803b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1804b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1805b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiService *service(GetServices().begin()->get());
1806b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1807b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1808b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1809b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1810b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1811b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  FireScanTimer();
1812b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1813b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());  // Automatically re-armed.
1814b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1815b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1816b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerReconfigured) {
1817b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1818b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1819b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1820b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1821b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(1);
1822b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1823b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1824b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1825b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1826b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1827b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  CancelScanTimer();
1828b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1829b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1830b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportScanDone();
1831b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1832b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1833b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1834b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1835b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1836b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_FALSE(GetScanTimer().IsCancelled());
1837b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1838b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  SetScanInterval(0);
1839b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_TRUE(GetScanTimer().IsCancelled());
1840b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1841b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1842b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1843b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  Error e;
1844b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  scoped_refptr<MockProfile> profile(
1845b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal      new NiceMock<MockProfile>(control_interface(), manager(), ""));
1846b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr hidden_service =
1847b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal      GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
1848b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal                      flimflam::kModeManaged, NULL, NULL, true, &e);
1849b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  hidden_service->set_profile(profile);
1850b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1851b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1852b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1853b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1854b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1855b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal            kNetworkModeInfrastructure);
1856b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1857b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged("an_ap");
1858b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1859b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1860b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1861b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1862b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal              Scan(HasHiddenSSID("hidden_ssid")));
1863b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1864b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1865b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1866b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1867b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawalTEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1868b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  StartWiFi();
1869b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1870b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1871b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1872b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal            kNetworkModeInfrastructure);
1873b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  InitiateConnect(service);
1874b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged("an_ap");
1875b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1876b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1877b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1878b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1879b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1880b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal  dispatcher_.DispatchPendingEvents();
1881b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal}
1882b66c646facf31a901629c1bc7da15b9c7d7d88c0mukesh agrawal
1883853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
1884