wifi_unittest.cc revision 5c05b2920be742d518829972127172481722058d
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"
405c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
41a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
42b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal#include "shill/mock_supplicant_bss_proxy.h"
433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
455c05b2920be742d518829972127172481722058dmukesh agrawal#include "shill/mock_time.h"
467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
47dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
513239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
52ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
53853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
54ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
55853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
56a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing std::set;
57853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
62a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
64b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalusing ::testing::Invoke;
657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
66dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
68ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morainusing ::testing::SaveArg;
69a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
70a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
71a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
72853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
748ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
75853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
79853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
813426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : device_(new WiFi(control_interface(),
823426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                         NULL, NULL, NULL, "wifi", "", 0)) {
83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
86853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
878abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  WiFiRefPtr device_;
88853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
89853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
91de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
92de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
93853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
94853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
956bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawalTEST_F(WiFiPropertyTest, SetProperty) {
96a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
97a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
986bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
99de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
100a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
101a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
102a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
103a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
104a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
105a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1066bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
1076bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         flimflam::kScanIntervalProperty,
1086bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         PropertyStoreTest::kUint16V,
1096bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                         &error));
110a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
111853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
112a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
113a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
1146bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
1156bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          flimflam::kScanningProperty,
1166bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          PropertyStoreTest::kBoolV,
1176bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal                                          &error));
1189d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
119a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
120853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1214d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1224d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1236bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_TRUE(DBusAdaptor::SetProperty(
1244d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1254d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1264d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant(
1274d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal            wpa_supplicant::kNetworkBgscanMethodSimple),
1284d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1294d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1304d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1314d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  {
1324d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal    ::DBus::Error error;
1336bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal    EXPECT_FALSE(DBusAdaptor::SetProperty(
1344d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        device_->mutable_store(),
1354d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        flimflam::kBgscanMethodProperty,
1364d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        DBusAdaptor::StringToVariant("not a real scan method"),
1374d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal        &error));
1384d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  }
1394d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
1404d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1418abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawalTEST_F(WiFiPropertyTest, ClearDerivedProperty) {
1428abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
1438abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal            WiFi::kDefaultBgscanMethod);
1448abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1458abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1468abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  ::DBus::Error error;
1476bb9e7c2c068fc15333babea8e66f02332683e33mukesh agrawal  EXPECT_TRUE(DBusAdaptor::SetProperty(
1488abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(),
1498abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      flimflam::kBgscanMethodProperty,
1508abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      DBusAdaptor::StringToVariant(
1518abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal          wpa_supplicant::kNetworkBgscanMethodLearn),
1528abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      &error));
1538abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
1548abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1558abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_TRUE(DBusAdaptor::ClearProperty(
1568abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal      device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
1578abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal  EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
1588abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal}
1598abd2f67616c3d138346781a49a40d4ae2bc7019mukesh agrawal
1608ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiMainTest : public ::testing::TestWithParam<string> {
1613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiMainTest()
1633426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le      : manager_(&control_interface_, NULL, &metrics_, &glib_),
164c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal        device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
165626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
1663239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal                       &dispatcher_,
1673426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                       &metrics_,
168626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
169626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
170626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
171626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
172dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
173dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
174dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
175b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        supplicant_bss_proxy_(
176b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal            new NiceMock<MockSupplicantBSSProxy>()),
177f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
178f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dispatcher_,
179f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dhcp_provider_,
180f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        kDeviceName,
181d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewart                                        kHostName,
182f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &glib_)),
183ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        proxy_factory_(this),
184ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        power_manager_(new MockPowerManager(&proxy_factory_)),
185ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        power_state_callback_(NULL) {
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());
219b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    if (supplicant_bss_proxy_.get()) {
220b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      EXPECT_CALL(*supplicant_bss_proxy_, Die());
221b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
222ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
2233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
2243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
2253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
2263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
2275c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
228f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
229f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
2303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
2327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
2333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
2343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
235b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    explicit TestProxyFactory(WiFiMainTest *test);
2363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
2381830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
239dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
2403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
2431830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const WiFiRefPtr &/*wifi*/,
2441830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
2451830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
246dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
2473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
249b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    MOCK_METHOD3(CreateSupplicantBSSProxy,
250b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                 SupplicantBSSProxyInterface *(
251b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     WiFiEndpoint *wifi_endpoint,
252b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const DBus::Path &object_path,
253b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal                     const char *dbus_addr));
254b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
255ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
256ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        PowerManagerProxyDelegate */*delegate*/) {
257ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain      return new MockPowerManagerProxy();
258ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    }
259ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
2603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
261b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
262b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        WiFiEndpoint */*wifi_endpoint*/,
263b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const DBus::Path &/*object_path*/,
264b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal        const char */*dbus_addr*/) {
265b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      return test_->supplicant_bss_proxy_.release();
266b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    }
267b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
268dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    WiFiMainTest *test_;
2693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
2721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    bool hidden_ssid = false;
2731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
2741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
2751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
2761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
2771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
279165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
2803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
2821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
2831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
284165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const vector<WiFiServiceRefPtr> &GetServices() {
285165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->services_;
2863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
2883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // proxies instantiated by WiFiMainTest), to ensure that WiFi
2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
2913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
2948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal    return dynamic_cast<MockSupplicantInterfaceProxy *>(
2958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal        wifi_->supplicant_interface_proxy_.get());
2963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2977ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
2987ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
2997ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
3007ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void InitiateConnect(WiFiServiceRefPtr service) {
3016e277774580c52073c919c4cbebedae27861d845mukesh agrawal    map<string, ::DBus::Variant> params;
3026e277774580c52073c919c4cbebedae27861d845mukesh agrawal    wifi_->ConnectTo(service, params);
3033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3040ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  void InitiateDisconnect(WiFiServiceRefPtr service) {
3050ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal    wifi_->DisconnectFrom(service);
3060ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  }
3071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
308e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal    return WiFiEndpoint::MakeOpenEndpoint(
309e1d90e9f688406d47a1453eeac51b7faaebf9908mukesh agrawal        &proxy_factory_, NULL, ssid, bssid, 0, 0);
3101590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
3117ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr MakeMockService() {
3127ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    vector<uint8_t> ssid(1, 'a');
3137ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return new MockWiFiService(
3147ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &control_interface_,
3157ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &dispatcher_,
3163426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le        &metrics_,
3177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &manager_,
3187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        wifi_,
3197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        ssid,
3207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kModeManaged,
3217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kSecurityNone,
3227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        false);
3237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
324261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
3253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
3263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
3273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
3283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
329e41a72d0737488d561a4158019409d5785dad61bThieu Le                 uint16 frequency,
3303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
33166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  void ClearCachedCredentials() {
33266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart    wifi_->ClearCachedCredentials();
33366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  }
334c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  void ReportIPConfigComplete() {
33579d74c9bdb654be48765c1e7aa416126ffd2ae5eDarin Petkov    wifi_->OnIPConfigUpdated(dhcp_config_, true);
336c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  }
337f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
338f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
339f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
3403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
341dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
3423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
3441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
3451590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
3467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
3477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
3487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
3493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
350ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
351ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain        .WillOnce(SaveArg<1>(&power_state_callback_));
3523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Start();
3533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
355910011207d66e14bf753d2783e131e7558126430Gary Morain    EXPECT_CALL(*power_manager_,
356910011207d66e14bf753d2783e131e7558126430Gary Morain                RemoveStateChangeCallback(wifi_->UniqueName()));
3573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
3583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
359ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
360ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  void GetOpenService(const char *service_type,
3617a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *ssid,
3627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *mode,
363ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                      Error *result) {
364ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
3657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
3667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  void GetService(const char *service_type,
3677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *ssid,
3687a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *mode,
3697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *security,
3707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *passphrase,
371ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                  Error *result) {
372ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, security, passphrase, false,
373ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                    result);
374ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
375ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  WiFiServiceRefPtr GetServiceInner(const char *service_type,
376ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *ssid,
377ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *mode,
378ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *security,
379ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *passphrase,
380a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                    bool allow_hidden,
381ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    Error *result) {
3827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    map<string, ::DBus::Variant> args;
3837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // in general, we want to avoid D-Bus specific code for any RPCs
3847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // that come in via adaptors. we make an exception here, because
3857a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // calls to GetWifiService are rerouted from the Manager object to
3867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // the Wifi class.
3877a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (service_type != NULL)
3887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kTypeProperty].writer().append_string(service_type);
3897a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (ssid != NULL)
3907a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSSIDProperty].writer().append_string(ssid);
3917a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (mode != NULL)
3927a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kModeProperty].writer().append_string(mode);
3937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (security != NULL)
3947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSecurityProperty].writer().append_string(security);
3957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (passphrase != NULL)
3967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
397a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    if (!allow_hidden)
398a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
3997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
400ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    Error e;
401ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    KeyValueStore args_kv;
4027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
403ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return wifi_->GetService(args_kv, result);
4047a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
405a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
406a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &mode,
407a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &security) {
408a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->FindService(ssid, mode, security);
409a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
410a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  bool LoadHiddenServices(StoreInterface *storage) {
411a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->LoadHiddenServices(storage);
412a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
413a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
414a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
415a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
416a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kTypeWifi,
417a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                kDeviceAddress,
418a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                hex_ssid.c_str(),
419a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kModeManaged,
420a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kSecurityNone));
421a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const char *groups[] = { id->c_str() };
422a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
423a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(Return(set<string>(groups, groups + 1)));
424a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
425a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
426a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
427a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
428a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
4293239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
4303239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
4313239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
432d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
433d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDeviceInfo *device_info() {
434d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &device_info_;
435d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
436d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
437d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  MockDHCPProvider *dhcp_provider() {
438d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain    return &dhcp_provider_;
439d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  }
440d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain
441ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  PowerManager::PowerStateCallback *power_state_callback() const {
442ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain    return power_state_callback_;
443ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  }
444ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
4453239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
4463239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
4473239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
4483239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
449b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  TestProxyFactory *proxy_factory() {
450b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    return &proxy_factory_;
451b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  }
452b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
4533239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  EventDispatcher dispatcher_;
4545c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
4555c05b2920be742d518829972127172481722058dmukesh agrawal  MockTime time_;
4563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
458dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
4593426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
460f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
4612ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
462c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockDeviceInfo device_info_;
4633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
4643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
4663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
4673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
4683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
469626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
470d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewart  static const char kHostName[];
4713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
4723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
4733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
474dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
475dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
476b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
477f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
478f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
4793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
4813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
482ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  MockPowerManager *power_manager_;
483ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  PowerManager::PowerStateCallback *power_state_callback_;
4843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
4853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0";
487a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartconst char WiFiMainTest::kDeviceAddress[] = "000102030405";
488d32f484b91ab583ccc9a14b2a6b5182fda6958f0Paul Stewartconst char WiFiMainTest::kHostName[] = "hostname";
4893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
4903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
4913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
492261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalvoid WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
493b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSRemovedTask(bss_path);
494261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
495261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
4963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
4973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
4983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
4993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
500e41a72d0737488d561a4158019409d5785dad61bThieu Le                             uint16 frequency,
5013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
5023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
5033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
5063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
5073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
5103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
5113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
5123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
5133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
5153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
5163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
517e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
518e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_int16(signal_strength);
519e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
520e41a72d0737488d561a4158019409d5785dad61bThieu Le      append_uint16(frequency);
521e41a72d0737488d561a4158019409d5785dad61bThieu Le  bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
522b4bc57dadc64612aaec2a7eab3b72b7d49d42d0bmukesh agrawal  wifi_->BSSAddedTask(bss_path, bss_properties);
5233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
525b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalWiFiMainTest::TestProxyFactory::TestProxyFactory(WiFiMainTest *test)
526b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal    : test_(test) {
527b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
528b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
529b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal      .WillByDefault(
530b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal          Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
531b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
532b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
5333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
5343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
5353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
5363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
5393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
5403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
5433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
5443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
5453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
5463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
5473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
5483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
5493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
5503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
5513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5523239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
5533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
5563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
5573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
5583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
5593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
5603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
5613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
5623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
5633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
5643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5653239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
5663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
5693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
5703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
5713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
574ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
575ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
576ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
577ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
578ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
5795c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
580ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(power_state_callback() != NULL);
581ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
582ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
583ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  power_state_callback()->Run(PowerManagerProxyDelegate::kOn);
584ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
585ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
586ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
587ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
588ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
589ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
590ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
591ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
592ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(power_state_callback() != NULL);
593ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(wifi()->IsIdle());
594ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
595ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  power_state_callback()->Run(PowerManagerProxyDelegate::kStandby);
596ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
597ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  power_state_callback()->Run(PowerManagerProxyDelegate::kMem);
598ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
599ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  power_state_callback()->Run(PowerManagerProxyDelegate::kDisk);
600ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
601ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
602ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
603ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary MorainTEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
604ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
605ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  StartWiFi();
606ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
607ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
608ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
609ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Error error;
610ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AddEndpoint(ap);
611ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  service->AutoConnect();
612ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_FALSE(wifi()->IsIdle());
613ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
614ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
615ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_TRUE(power_state_callback() != NULL);
616ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  ASSERT_FALSE(wifi()->IsIdle());
617ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
618ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  power_state_callback()->Run(PowerManagerProxyDelegate::kOn);
619ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  dispatcher_.DispatchPendingEvents();
620ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain}
621ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain
6223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
623d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
6243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
625e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
627e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
629e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
631e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
632e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency = 2412;
633e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
634e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeAdHoc);
635e41a72d0737488d561a4158019409d5785dad61bThieu Le
636e41a72d0737488d561a4158019409d5785dad61bThieu Le  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
637e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(5, endpoints_by_rpcid.size());
638e41a72d0737488d561a4158019409d5785dad61bThieu Le
639e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFi::EndpointMap::const_iterator i;
640e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiEndpointRefPtr endpoint;
641e41a72d0737488d561a4158019409d5785dad61bThieu Le  for (i = endpoints_by_rpcid.begin();
642e41a72d0737488d561a4158019409d5785dad61bThieu Le       i != endpoints_by_rpcid.end();
643e41a72d0737488d561a4158019409d5785dad61bThieu Le       ++i) {
644e41a72d0737488d561a4158019409d5785dad61bThieu Le    if (i->second->bssid_string() == "00:00:00:00:00:04")
645e41a72d0737488d561a4158019409d5785dad61bThieu Le      break;
646e41a72d0737488d561a4158019409d5785dad61bThieu Le  }
647e41a72d0737488d561a4158019409d5785dad61bThieu Le  ASSERT_TRUE(i != endpoints_by_rpcid.end());
648e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(4, i->second->signal_strength());
649e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency, i->second->frequency());
650e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ("adhoc", i->second->network_mode());
6513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
654d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
655d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
656d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
6573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
658e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
660e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
662e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
664e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
665e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
666165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
667165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
668165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, endpoints_by_rpcid.size());
669165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
670165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFi::EndpointMap::const_iterator i;
671165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFiEndpointRefPtr endpoint;
672165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  for (i = endpoints_by_rpcid.begin();
673165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       i != endpoints_by_rpcid.end();
674165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       ++i) {
675165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    if (i->second->bssid_string() == "00:00:00:00:00:00")
676165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal      break;
677165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  }
678165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ASSERT_TRUE(i != endpoints_by_rpcid.end());
679165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(4, i->second->signal_strength());
6803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
6813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
6823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
6833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
684261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
685261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(3);
686e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
6873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
688e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
6893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
690e41a72d0737488d561a4158019409d5785dad61bThieu Le      "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
6913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
692165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, GetServices().size());
693b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
694e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with SSIDs that start with NULL should be filtered.
695e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
696e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
697b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal  EXPECT_EQ(3, GetServices().size());
698b385761b76687f8aa08ad8b0cbd70c7fa6c6c50emukesh agrawal
699e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // BSSes with empty SSIDs should be filtered.
700e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
701e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
702e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(3, GetServices().size());
703165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
704165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
705165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingTogether) {
706165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
707261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
708261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  InSequence s;
709261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
710d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
711261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
712e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
713e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
714165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
715165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(1, GetServices().size());
716165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
717165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
718165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
719165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
720261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
721261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
722e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
723e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
724165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
725165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
726165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
727165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
728165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
729165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
730261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
731261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
732e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
733e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
734e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
735165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
736165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
7373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
7383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
739261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonExistentBSSRemoved) {
740261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  // Removal of non-existent BSS should not cause a crash.
741261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
742261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
743261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(0, GetServices().size());
744261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
745261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
746e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
747e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with an empty SSID should not cause a crash.
748e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
749e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
750e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
751e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
752e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
753e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
754e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawalTEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
755e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  // Removal of BSS with a NULL SSID should not cause a crash.
756e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
757e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  StartWiFi();
758e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  RemoveBSS("bss");
759e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal  EXPECT_EQ(0, GetServices().size());
760e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal}
761e9adda1335ce052bcd3680afd5b5811d732a5fd3mukesh agrawal
762261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemoved) {
763d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
764261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
765e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
766261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
767261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
768261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
769261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
7708a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
771261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
7728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
7738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
7748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
7758a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
776d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
7778a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
778e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
7798a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
7808a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss0");
7818a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
7828a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
7838a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
7848a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss0");
7858a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(GetServices().empty());
7868a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
7878a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
7888a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
789d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
790d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
7918a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
7928a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
7938a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error e;
7948a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service =
7958a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal      GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
7968a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal                      NULL, NULL, true, &e);
7978a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
7988a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
799e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
800e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
8018a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportScanDone();
8028a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  ReportCurrentBSSChanged("bss");
803261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8048a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
8058a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
8068a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  RemoveBSS("bss");
8078a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(1, GetServices().size());
8088a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // Verify expectations now, because WiFi may call UpdateService when
8098a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  // WiFi is Stop()-ed (during TearDown()).
8108a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Mock::VerifyAndClearExpectations(manager());
811d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
812261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
813261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
814261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
815d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_));
816d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_));
817d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_));
818261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
819e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
820e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
821261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
822261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
823261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
824261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
825261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
826261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
827261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
828261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
829261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
830261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
8313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
832d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
833dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
834dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
835dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
8363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
837e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
8393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
8413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
8423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
843165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    WiFiService *service(GetServices().begin()->get());
8443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
845dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
8463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
847dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
8483239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    InitiateConnect(service);
849f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    EXPECT_EQ(static_cast<Service *>(service),
850f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal              wifi()->selected_service_.get());
8513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
8523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
8533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
8540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingService) {
855d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
8560ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
8570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
8580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
860e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
8610ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
8620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
8630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_FALSE(GetPendingService() == NULL);
8650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
8660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
8670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
8690ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
8700ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8710ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
872d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
873d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
874d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
875d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
8760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
8770ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
8780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
880e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
881e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
8820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
8830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
8840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
8860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
8870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
8880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
8890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
8910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
8920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
8930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service1);
8940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
8950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| will be unchanged until supplicant signals
8960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // that CurrentBSS has changed.
8970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
8980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |pending_service_| is updated immediately.
8990ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetPendingService() == NULL);
9000ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9010ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9020ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentService) {
903d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
904d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
905d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
906d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9070ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9080ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9090ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9100ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
911e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9120ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9130ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
9140ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9150ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9160ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9170ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9180ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect());
9190ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9200ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9210ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // |current_service_| should not change until supplicant reports
9220ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  // a BSS change.
9230ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9240ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9250ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9260ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
927d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
928d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
929d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
930d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9310ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9320ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9330ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9340ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
935e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
936e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
9370ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service0(GetServices()[0].get());
9380ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service1(GetServices()[1].get());
9390ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9400ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service0);
9410ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9420ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9430ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service1);
9440ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9450ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9460ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9470ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
9480ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
9490ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service0);
9500ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9510ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service0, GetCurrentService());
9520ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service1, GetPendingService());
9530ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9540ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9550ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectInvalidService) {
956d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
9570ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9580ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9590ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9600ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
961e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9620ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9630ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
9640ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .Times(0);
9650ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9660ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9670ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9680ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawalTEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
969d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
970d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
971d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
972d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
9730ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
9740ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      *supplicant_interface_proxy_;
9750ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9760ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  StartWiFi();
977e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
9780ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9790ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  WiFiService *service(GetServices().begin()->get());
9800ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  DBus::Path fake_path("/fake/path");
9810ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
9820ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillOnce(Return(fake_path));
9830ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateConnect(service);
9840ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportCurrentBSSChanged("bss0");
9850ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9860ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9870ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_EQ(service, GetCurrentService());
9880ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, Disconnect())
9890ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal      .WillRepeatedly(Throw(
9900ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal          DBus::Error(
9910ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "fi.w1.wpa_supplicant1.NotConnected",
9920ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal              "test threw fi.w1.wpa_supplicant1.NotConnected")));
9930ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
9940ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  InitiateDisconnect(service);
9950ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9960ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal  EXPECT_TRUE(GetCurrentService() == NULL);
9970ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal}
9980ed0f2e84c366a90bca4a824b0adf18e9f243369mukesh agrawal
9995c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
1000d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1001c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1002e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1003c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportScanDone();
10045c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1005c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*manager(), DeregisterService(_));
1006c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StopWiFi();
10075c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
10085c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
10097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpen) {
10107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1011a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
10127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
10167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1017a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
10187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
10197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify SSID", e.message());
10207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10227a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
10237a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
10247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  GetOpenService(
1025a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kTypeWifi, "123456789012345678901234567890123",
1026a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kModeManaged, &e);
10277a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too long", e.message());
10297a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
10327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1033a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
10347a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
10357a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too short", e.message());
10367a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10387a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
10397a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1040a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
10417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
10427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("service mode is unsupported", e.message());
10437a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
10467a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1047a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
10487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSN) {
10527a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1053a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1054a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, "secure password", &e);
10557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
10597a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1060a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1061a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, NULL, &e);
10627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
10637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify passphrase", e.message());
10647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
10677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1068a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1069a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             NULL, &e);
10707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
10717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("security mode is unsupported", e.message());
10727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10737a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10747a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
10757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1076a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1077a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, NULL, &e);
10787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
10797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify passphrase", e.message());
10807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
10837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1084a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1085a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "", &e);
10867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
10877a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10897a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
10907a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1091a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1092a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcde", &e);
10937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
10947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
10957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
10967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
10977a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1098a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1099a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcdefghijklm", &e);
11007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
11047a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1105a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1106a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:abcdefghijklm", &e);
11077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
11117a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1112a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1113a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405", &e);
11147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
11187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1119a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1120a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "O102030405", &e);
11217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11227a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11237a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
11257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1126a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1127a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:O102030405", &e);
11287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11297a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
11327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1133a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1134a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:0xO102030405", &e);
11357a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11367a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11387a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
11397a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1140a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1141a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0xO102030405", &e);
11427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11437a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
11467a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1147a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1148a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
11497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11527a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
11537a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1154a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1155a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
11567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11597a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
11607a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1161a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1162a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
11637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
11677a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
1168a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1169a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
11707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
11727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
11738ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceSuccessTest : public WiFiMainTest {};
11748ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceFailureTest : public WiFiMainTest {};
11758ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
11768ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceSuccessTest, Passphrase) {
11778ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1178a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1179a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
11808ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
11818ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
11828ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
11838ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceFailureTest, Passphrase) {
11848ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
1185a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1186a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
11878ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
11888ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
11898ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
11908ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
11918ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTestInstance,
11928ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTest,
11938ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
11948ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
11958ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
11968ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        // subtle: invalid length for hex key, but valid as ascii passphrase
11978ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen-1, '1'),
11988ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen, '1')));
11998ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12008ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
12018ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTestInstance,
12028ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTest,
12038ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
12048ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
12058ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
12068ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen+1, '1')));
12078ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
12086ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWEP) {
12096ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12106ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12116ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1212a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12136ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityWep, "abcde", &e);
12146ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12156ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12166ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
12176ab23a9d4526686406d50081853639540b22213aPaul Stewart
1218a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1219a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityWep).get());
1220a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1221a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                           flimflam::kSecurityWpa).get());
12226ab23a9d4526686406d50081853639540b22213aPaul Stewart}
12236ab23a9d4526686406d50081853639540b22213aPaul Stewart
12246ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWPA) {
12256ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
12266ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12276ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
1228a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
12296ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityRsn, "abcdefgh", &e);
12306ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12316ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12326ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1233a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1234a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityWpa));
12356ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(wpa_service.get());
1236a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1237a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityRsn));
12386ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(rsn_service.get());
12396ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), rsn_service.get());
1240a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1241a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityPsk));
12426ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), psk_service.get());
12436ab23a9d4526686406d50081853639540b22213aPaul Stewart  // Indirectly test FindService by doing a GetService on something that
12446ab23a9d4526686406d50081853639540b22213aPaul Stewart  // already exists.
12456ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
12466ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
12476ab23a9d4526686406d50081853639540b22213aPaul Stewart    WiFiServiceRefPtr wpa_service2(
1248a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1249a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        flimflam::kModeManaged, flimflam::kSecurityWpa,
1250a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        "abcdefgh", false, &e));
12516ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
12526ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_EQ(wpa_service.get(), wpa_service2.get());
12536ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
12546ab23a9d4526686406d50081853639540b22213aPaul Stewart}
12556ab23a9d4526686406d50081853639540b22213aPaul Stewart
1256ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
1257a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
1258ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
1259ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
1260ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
1261ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
1262ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1263ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
1264ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1265ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
1266ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
1267ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
1268ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
1269ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
1270ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  return ssids.size() == 2 &&
1271ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      string(ssids[0].begin(), ssids[0].end()) == ssid &&
1272ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      ssids[1].empty();
1273ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1274ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
1275ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
1276ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1277ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1278ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .Times(AnyNumber())
1279ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .WillRepeatedly(Throw(
1280ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart          DBus::Error(
1281ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "fi.w1.wpa_supplicant1.InterfaceUnknown",
1282ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
1283a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
1284a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a hidden, favorite service.
1285a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1286a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1287a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1288a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1289a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1290a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
129100917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal    service->MakeFavorite();
1292a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1293a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
1294a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a hidden, non-favorite service.
1295a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1296a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1297a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1298a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
1299a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1300a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
1301a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1302a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
1303a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a non-hidden, favorite service.
1304a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
1305a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
1306a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1307a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, false, &e);
1308a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
1309a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_FALSE(service->hidden_ssid());
131000917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal    service->MakeFavorite();
1311a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
1312a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
1313ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
1314ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
1315ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
1316ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
13177ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
13187ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
13197ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13207ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13217ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
13227ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
13237ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
13247ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
13257ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13267ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13277ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
13287ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
13297ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
13317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
13327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
13347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
13357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
13367ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
13377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1338d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
13397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
13417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
13427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
13437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
1344d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1345d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
13467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
13477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
13487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
1349d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
13507ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
13517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
13527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
13537ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
13547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
13557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
13567ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
13577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
1358d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
13597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
13607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1361a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1362a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1363a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1364a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(set<string>()));
1365a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1366a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1367a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1368a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1369a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1370a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1371a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1372a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "Hidden" property.
1373a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1374a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1375a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1376a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1377a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1378a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1379a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1380a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1381a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1382a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // "Hidden" property set to "false".
1383a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1384a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1385a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1386a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1387a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1388a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1389a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1390a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1391a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1392a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "SSID" property.
1393a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1394a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1395a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1396a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1397a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1398a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1399a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1400a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1401a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1402a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1403a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  Error e;
1404a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1405a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  ASSERT_TRUE(e.IsSuccess());
1406a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1407a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1408a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1409a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1410d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1411a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1412a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string ssid("an_ssid");
1413a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1414a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, ssid, &id);
1415a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(LoadHiddenServices(&storage));
1416a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1417a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1418a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityNone).get());
1419a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1420a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
14211590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1422d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1423d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1424d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1425d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
14261590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
14271590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
14281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
14301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
14311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
14321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1434e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
14351590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
14361590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
14371590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetPendingService().get());
14381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
14401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
14421590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetCurrentService().get());
14431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14451590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
14468a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(Service::kStateFailure, service->state());
14471590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
14481590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
14491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14501590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14511590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1452d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1453d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1454d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1455d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
14561590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
14571590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
14581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
14591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
14601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handles used in this test ("ap1", "ap2") are
14621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // not intended to reflect the format used by supplicant. They're
14631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // just convenient for testing.
14641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14651590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1466e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
14671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
1468e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
14691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
14701590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service1);
14711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap1");
14721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service1.get(), GetCurrentService().get());
14741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1475c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Note that we deliberately omit intermediate supplicant states
1476c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // (e.g. kInterfaceStateAssociating), on the theory that they are
1477c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // unreliable. Specifically, they may be quashed if the association
1478c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // completes before supplicant flushes its changed properties.
14791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap2");
14801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
14811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service2.get(), GetCurrentService().get());
14821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateIdle, service1->state());
14831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service2->state());
14841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
14851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14861590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1487d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1488d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1489d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1490d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
14911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
14921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
14931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14941590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
14951590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
14961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
14971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
14981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
1499e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
15001590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
15011590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
15021590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
15031590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
15041590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service.get(), GetCurrentService().get());
15051590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
15061590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
15071590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1508e41a72d0737488d561a4158019409d5785dad61bThieu LeTEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
1509b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1510b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1511b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1512b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1513e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency1 = 2412;
1514e41a72d0737488d561a4158019409d5785dad61bThieu Le  const uint16 frequency2 = 2442;
1515e41a72d0737488d561a4158019409d5785dad61bThieu Le  StartWiFi();
1516e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1517e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1518e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1519e41a72d0737488d561a4158019409d5785dad61bThieu Le            kNetworkModeInfrastructure);
1520e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(1, GetServices().size());
1521e41a72d0737488d561a4158019409d5785dad61bThieu Le  WiFiService *service(GetServices()[0].get());
1522e41a72d0737488d561a4158019409d5785dad61bThieu Le  InitiateConnect(service);
1523e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss1");
1524e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency1, service->frequency_);
1525e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportCurrentBSSChanged("bss2");
1526e41a72d0737488d561a4158019409d5785dad61bThieu Le  EXPECT_EQ(frequency2, service->frequency_);
1527e41a72d0737488d561a4158019409d5785dad61bThieu Le}
1528e41a72d0737488d561a4158019409d5785dad61bThieu Le
15294eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawalTEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
15304eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  Error e;
15314eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
15324eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .Times(0);
15334eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), HasService(_))
15344eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal      .WillOnce(Return(false));
15354eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
15364eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
1537e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
15384eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal            kNetworkModeInfrastructure);
15394eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal}
15404eb4d782b83850552af41f675d22250601b9fb8dmukesh agrawal
15418a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1542d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1543d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
15448a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15458a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
15468a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
15478a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
15488a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15498a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
1550e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
15518a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
1552e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
15538a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal            kNetworkModeInfrastructure);
15548a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service1);
15558a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service1.get(), GetPendingService().get());
15568a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15578a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
15588a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
15598a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  InitiateConnect(service2);
15608a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_EQ(service2.get(), GetPendingService().get());
15618a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15628a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15638a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawalTEST_F(WiFiMainTest, IsIdle) {
15648a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  StartWiFi();
15658a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_TRUE(wifi()->IsIdle());
15668a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15678a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
15688a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
15698a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  Error error;
15708a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AddEndpoint(ap);
15718a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  service->AutoConnect();
15728a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal  EXPECT_FALSE(wifi()->IsIdle());
15738a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal}
15748a3188dbc04245c17a4729d16a632547ce4bf585mukesh agrawal
15754d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalMATCHER(WiFiAddedArgs, "") {
15764d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
15774d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
15784d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15794d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15804d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawalTEST_F(WiFiMainTest, AddNetworkArgs) {
1581d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
15824d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
15834d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal      *supplicant_interface_proxy_;
15844d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
15854d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  StartWiFi();
1586e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
15874d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  WiFiService *service(GetServices().begin()->get());
15884d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
15894d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal  InitiateConnect(service);
15904d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal}
15914d0401cd44d6082f03ace63134b64dec0bc99116mukesh agrawal
1592c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1593c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1594c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
1595c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1596c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1597c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1598c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportLinkUp();
1599c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1600c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // Verify expectations now, because WiFi may cause |service| state
1601c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  // changes during TearDown().
1602c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1603d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
1604c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1605c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1606c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompleted) {
1607d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1608d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1609d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1610c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1611c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1612c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1613c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1614e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1615c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1616c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1617c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1618c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1619c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1620c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1621c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
1622c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1623c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1624c01f3983048b882154099b4d284f0c145510b68bmukesh agrawalTEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
1625d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1626d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1627d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1628d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
1629d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1630d9f893fba21b093cf63939e6e2c58bc77d6f2bdbGary Morain  EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1631ac1bdb47b498a82460c995742ac5892f9a4d7e57Gary Morain  EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
1632c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1633c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1634c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1635c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  StartWiFi();
1636e41a72d0737488d561a4158019409d5785dad61bThieu Le  ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1637c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal            kNetworkModeInfrastructure);
1638c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  InitiateConnect(service);
1639c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportCurrentBSSChanged("ap");
1640c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1641c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportIPConfigComplete();
1642c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  Mock::VerifyAndClearExpectations(service);
1643c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
1644c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1645c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1646c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal}
1647c01f3983048b882154099b4d284f0c145510b68bmukesh agrawal
164866c8600f8410ed205701921d58d9e2c00000047cPaul StewartTEST_F(WiFiMainTest, ClearCachedCredentials) {
164966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
165066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      *supplicant_interface_proxy_;
165166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
165266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  StartWiFi();
165366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
165466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure call to the proxy is deferred.
165566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
165666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
165766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
165866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
165966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
166066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
166166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
166266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
166366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
166466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
166566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
166666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
166766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
166866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(0);
166966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
167066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  ClearCachedCredentials();
167166c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
167266c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
167366c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
167466c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // Ensure multiple calls to ClearCachedCredentials() results in only
167566c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  // one call to the proxy.
167666c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
167766c8600f8410ed205701921d58d9e2c00000047cPaul Stewart      .Times(1);
167866c8600f8410ed205701921d58d9e2c00000047cPaul Stewart  dispatcher_.DispatchPendingEvents();
167966c8600f8410ed205701921d58d9e2c00000047cPaul Stewart}
168066c8600f8410ed205701921d58d9e2c00000047cPaul Stewart
1681b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1682b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1683b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1684b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // we can test the interaction between WiFi and WiFiEndpoint. (Right
1685b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // now, we're testing across multiple layers.)
1686b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1687b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1688b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1689b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1690b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1691b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1692b20776f4bb664c2256a414ca04114725c95d606emukesh agrawalTEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1693b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1694b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // factory for WiFiEndpoints.
1695b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1696b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
1697b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Get the pointer before we transfer ownership.
1698b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1699b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  EXPECT_CALL(*proxy, Die());
1700b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  StartWiFi();
1701b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1702b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  RemoveBSS("bss0");
1703b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // Check this now, to make sure RemoveBSS killed the proxy (rather
1704b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  // than TearDown).
1705b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal  Mock::VerifyAndClearExpectations(proxy);
1706b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal}
1707b20776f4bb664c2256a414ca04114725c95d606emukesh agrawal
17085c05b2920be742d518829972127172481722058dmukesh agrawalTEST_F(WiFiMainTest, FlushBSSOnResume) {
17095c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval resume_time = {1, 0};
17105c05b2920be742d518829972127172481722058dmukesh agrawal  const struct timeval scan_done_time = {6, 0};
17115c05b2920be742d518829972127172481722058dmukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
17125c05b2920be742d518829972127172481722058dmukesh agrawal      *supplicant_interface_proxy_;
17135c05b2920be742d518829972127172481722058dmukesh agrawal
17145c05b2920be742d518829972127172481722058dmukesh agrawal  StartWiFi();
17155c05b2920be742d518829972127172481722058dmukesh agrawal
17165c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(time_, GetTimeMonotonic(_))
17175c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
17185c05b2920be742d518829972127172481722058dmukesh agrawal      .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
17195c05b2920be742d518829972127172481722058dmukesh agrawal  EXPECT_CALL(supplicant_interface_proxy,
17205c05b2920be742d518829972127172481722058dmukesh agrawal              FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
17215c05b2920be742d518829972127172481722058dmukesh agrawal  power_state_callback()->Run(PowerManagerProxyDelegate::kOn);
17225c05b2920be742d518829972127172481722058dmukesh agrawal  ReportScanDone();
17235c05b2920be742d518829972127172481722058dmukesh agrawal}
17245c05b2920be742d518829972127172481722058dmukesh agrawal
1725853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
1726