wifi_unittest.cc revision 261daca461a38a700db80b1fee0fb1f50941aaf9
1853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone// Copyright (c) 2011 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"
33f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
34f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
352ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
365c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal#include "shill/mock_rtnl_handler.h"
37a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart#include "shill/mock_store.h"
383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal#include "shill/mock_wifi_service.h"
41dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
42853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi.h"
463239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
47ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart#include "shill/wpa_supplicant.h"
48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
49853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
50a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing std::set;
51853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
52853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
53853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
56a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::DoAll;
573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalusing ::testing::Mock;
59dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
60853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
61a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::SetArgumentPointee;
62a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrEq;
63a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartusing ::testing::StrictMock;
64853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
668ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalusing ::testing::Values;
67853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
68853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
69853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
71853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
732176a88f197d802924d2a83d368e3efab7a6be4bChris Masone      : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
74853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
76853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
77853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
78853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  DeviceRefPtr device_;
79853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
80853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
82de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
83de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
84853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
85853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Dispatch) {
87a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
88a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
89de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
90a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kBgscanMethodProperty,
91a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kStringV,
92a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
93a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
94a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
95a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
96a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    EXPECT_TRUE(DBusAdaptor::DispatchOnType(
97de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
98a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
99a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
100a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
101a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
102a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
103a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
104de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
105a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kScanIntervalProperty,
106a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kUint16V,
107a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
108a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
109853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
110a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
111a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
112de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
113a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             flimflam::kScanningProperty,
114a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             PropertyStoreTest::kBoolV,
115a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             &error));
1169d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
117a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
118853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
119853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1208ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiMainTest : public ::testing::TestWithParam<string> {
1213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
1223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiMainTest()
123b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone      : manager_(&control_interface_, NULL, &glib_),
124626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
1253239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal                       &dispatcher_,
126626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
127626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
128626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
129626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
130dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
131dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
132dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
133f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
134f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dispatcher_,
135f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dhcp_provider_,
136f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        kDeviceName,
137f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &glib_)),
138dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        proxy_factory_(this) {
1393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1415c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1425c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void SetUp() {
143ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = &proxy_factory_;
1445c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
1455c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
146b9c00597eb1f6d2560f7e88cb0d1f627228840d4Chris Masone    EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
1475c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
1485c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
1495c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  virtual void TearDown() {
150ab565bb6f148849fc0ceb12529ff93acfbbed71fDarin Petkov    wifi_->proxy_factory_ = NULL;
1513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
1523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
1533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
1543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
1555c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    wifi_->set_dhcp_provider(NULL);
156f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
157f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
1583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
1597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
1607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
1613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
1637355ce1937c504d836a303ac809bd436272212b3Paul Stewart    explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
1643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
1661830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_path*/, const char */*dbus_addr*/) {
167dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
1683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
1711830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const WiFiRefPtr &/*wifi*/,
1721830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const DBus::Path &/*object_path*/,
1731830fa1f2e8691073f4d07b0883f059a290a9cc2mukesh agrawal        const char */*dbus_addr*/) {
174dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
1753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
178dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    WiFiMainTest *test_;
1793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
1803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
1821590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    bool hidden_ssid = false;
1831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
1841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
1851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetCurrentService() {
1861590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->current_service_;
1871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
1883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
189165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->endpoint_by_rpcid_;
1903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  const WiFiServiceRefPtr &GetPendingService() {
1921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return wifi_->pending_service_;
1931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
194165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const vector<WiFiServiceRefPtr> &GetServices() {
195165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    return wifi_->services_;
1963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
1983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // proxies instantiated by WiFiMainTest), to ensure that WiFi
1993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
2003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
2013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
2023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
2043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_interface_proxy_.get();
2053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2067ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  const string &GetSupplicantState() {
2077ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return wifi_->supplicant_state_;
2087ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
2097ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void InitiateConnect(WiFiServiceRefPtr service) {
2106e277774580c52073c919c4cbebedae27861d845mukesh agrawal    map<string, ::DBus::Variant> params;
2116e277774580c52073c919c4cbebedae27861d845mukesh agrawal    wifi_->ConnectTo(service, params);
2123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
213f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  bool IsLinkUp() {
214f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    return wifi_->link_up_;
215f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
2161590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
2171590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    map <string, ::DBus::Variant> args;
2181590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    ::DBus::MessageIter writer;
2191590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2201590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    writer = args[wpa_supplicant::kBSSPropertySSID].writer();
2211590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
2221590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2231590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    string bssid_nosep;
2241590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
2251590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    vector<uint8_t> bssid_bytes;
2261590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
2271590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    writer = args[wpa_supplicant::kBSSPropertyBSSID].writer();
2281590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    writer << bssid_bytes;
2291590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    args[wpa_supplicant::kBSSPropertySignal].writer().append_int16(0);
2311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    args[wpa_supplicant::kBSSPropertyMode].writer().append_string(
2321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal        wpa_supplicant::kNetworkModeInfrastructure);
2331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    // We indicate this is an open BSS by leaving out all security properties.
2341590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
2351590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    return new WiFiEndpoint(args);
2361590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
2377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr MakeMockService() {
2387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    vector<uint8_t> ssid(1, 'a');
2397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    return new MockWiFiService(
2407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &control_interface_,
2417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &dispatcher_,
2427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        &manager_,
2437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        wifi_,
2447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        ssid,
2457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kModeManaged,
2467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        flimflam::kSecurityNone,
2477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal        false);
2487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
249261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  void RemoveBSS(const ::DBus::Path &bss_path);
2503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
2513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
2523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
255f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
256f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
257f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
2583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
259dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
2603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  void ReportCurrentBSSChanged(const string &new_bss) {
2621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal    wifi_->CurrentBSSChanged(new_bss);
2631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  }
2647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  void ReportStateChanged(const string &new_state) {
2657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal    wifi_->StateChanged(new_state);
2667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  }
2673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
2683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Start();
2693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
2723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
273a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart void GetOpenService(const char *service_type,
2747a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *ssid,
2757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                      const char *mode,
276ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                      Error *result) {
277ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
2787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
2797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  void GetService(const char *service_type,
2807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *ssid,
2817a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *mode,
2827a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *security,
2837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal                  const char *passphrase,
284ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                  Error *result) {
285ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    GetServiceInner(service_type, ssid, mode, security, passphrase, false,
286ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                    result);
287ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
288ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  WiFiServiceRefPtr GetServiceInner(const char *service_type,
289ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *ssid,
290ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *mode,
291ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *security,
292ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    const char *passphrase,
293a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                    bool allow_hidden,
294ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart                                    Error *result) {
2957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    map<string, ::DBus::Variant> args;
2967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // in general, we want to avoid D-Bus specific code for any RPCs
2977a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // that come in via adaptors. we make an exception here, because
2987a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // calls to GetWifiService are rerouted from the Manager object to
2997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    // the Wifi class.
3007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (service_type != NULL)
3017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kTypeProperty].writer().append_string(service_type);
3027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (ssid != NULL)
3037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSSIDProperty].writer().append_string(ssid);
3047a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (mode != NULL)
3057a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kModeProperty].writer().append_string(mode);
3067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (security != NULL)
3077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kSecurityProperty].writer().append_string(security);
3087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    if (passphrase != NULL)
3097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal      args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
310a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    if (!allow_hidden)
311a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
3127a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
313ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    Error e;
314ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    KeyValueStore args_kv;
3157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal    DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
316ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return wifi_->GetService(args_kv, result);
3177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  }
318a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
319a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &mode,
320a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                const string &security) {
321a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->FindService(ssid, mode, security);
322a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
323a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  bool LoadHiddenServices(StoreInterface *storage) {
324a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    return wifi_->LoadHiddenServices(storage);
325a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
326a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
327a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
328a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
329a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kTypeWifi,
330a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                kDeviceAddress,
331a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                hex_ssid.c_str(),
332a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kModeManaged,
333a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                                flimflam::kSecurityNone));
334a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    const char *groups[] = { id->c_str() };
335a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
336a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(Return(set<string>(groups, groups + 1)));
337a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
338a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
339a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
340a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
341a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
3423239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
3433239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
3443239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
3453239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
3463239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
3473239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
3483239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
3493239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  EventDispatcher dispatcher_;
3505c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  NiceMock<MockRTNLHandler> rtnl_handler_;
3513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
353dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
354f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
3552ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
3563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
3573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
3593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
3603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
3613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
362626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
3633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
3643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
3653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
366dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
367dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
368f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
369f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
3703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
3723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
3733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
3743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0";
376a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewartconst char WiFiMainTest::kDeviceAddress[] = "000102030405";
3773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
3783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
3793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
380261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalvoid WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
381261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  wifi_->BSSRemoved(bss_path);
382261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
383261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
3843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
3853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
3863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
3873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
3883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
3893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
3903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
3923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
3933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
3943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
3963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
3973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
3983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
3993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
4003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
4023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
4033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
4043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Signal"].writer().append_int16(signal_strength);
4053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Mode"].writer().append_string(mode);
4063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  wifi_->BSSAdded(bss_path, bss_properties);
4073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
4103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
4113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
4123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
4153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
4163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
4193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
4203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
4213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
4223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
4233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
4243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
4253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
4263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
4273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4283239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
4293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
4323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
4333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
4343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
4353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
4363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
4373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
4383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
4393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
4403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4413239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
4423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
4453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
4463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
4473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
4513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
4533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
4553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
4573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
4593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
4603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(5, GetEndpointMap().size());
4613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
4643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
4653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
4663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
4683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
4703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
4723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
473165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
474165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
475165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, endpoints_by_rpcid.size());
476165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
477165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFi::EndpointMap::const_iterator i;
478165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  WiFiEndpointRefPtr endpoint;
479165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  for (i = endpoints_by_rpcid.begin();
480165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       i != endpoints_by_rpcid.end();
481165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal       ++i) {
482165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    if (i->second->bssid_string() == "00:00:00:00:00:00")
483165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal      break;
484165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  }
485165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ASSERT_TRUE(i != endpoints_by_rpcid.end());
486165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(4, i->second->signal_strength());
4873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
4883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
4893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
4903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
491261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
492261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(3);
4933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
4943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
4963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
4973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
4983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
499165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(3, GetServices().size());
500165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
501165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
502165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingTogether) {
503165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
504261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
505261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  InSequence s;
506261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_));
507261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
508165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
509165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
510165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
511165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(1, GetServices().size());
512165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
513165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
514165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
515165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
516261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
517261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
518165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
519165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
520165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
521165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
522165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal}
523165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal
524165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawalTEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
525165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  StartWiFi();
526261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
527261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal      .Times(2);
528165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
529165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
530165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  ReportScanDone();
531165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal  EXPECT_EQ(2, GetServices().size());
5323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
534261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonExistentBSSRemoved) {
535261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  // Removal of non-existent BSS should not cause a crash.
536261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
537261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
538261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(0, GetServices().size());
539261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
540261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
541261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, LoneBSSRemoved) {
542261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
543261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
544261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
545261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
546261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
547261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
548261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
549261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
550261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_FALSE(GetServices().front()->IsVisible());
551261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
552261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
553261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
554261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawalTEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
555261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  StartWiFi();
556261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
557261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
558261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  ReportScanDone();
559261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
560261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
561261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
562261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_CALL(*manager(), UpdateService(_));
563261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  RemoveBSS("bss0");
564261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_TRUE(GetServices().front()->IsVisible());
565261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal  EXPECT_EQ(1, GetServices().size());
566261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal}
567261daca461a38a700db80b1fee0fb1f50941aaf9mukesh agrawal
5683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
569dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
570dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
571dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
5723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
5733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
5743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
5753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
5763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
5773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
5783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
579165e614021915fa551186acaa202e1e1bf403f4bmukesh agrawal    WiFiService *service(GetServices().begin()->get());
5803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
581dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
5823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
583dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
5843239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    InitiateConnect(service);
585f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    EXPECT_EQ(static_cast<Service *>(service),
586f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal              wifi()->selected_service_.get());
5873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
5883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
5893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
590f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawalTEST_F(WiFiMainTest, LinkEvent) {
591f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  EXPECT_FALSE(IsLinkUp());
592f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
593f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal      WillOnce(Return(dhcp_config_));
594f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  ReportLinkUp();
595f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal}
596f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
5975c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawalTEST_F(WiFiMainTest, Stop) {
5985c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  {
5995c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    InSequence s;
6005c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6015c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    StartWiFi();
6025c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
6035c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    ReportScanDone();
6045c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
6055c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal        WillOnce(Return(dhcp_config_));
6065c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    ReportLinkUp();
6075c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
6085c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6095c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  {
6105c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    EXPECT_CALL(*manager(), DeregisterService(_));
6115c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal    StopWiFi();
6125c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal  }
6135c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal}
6145c4dd0b0886fb10deae0d3b40628fb2c521aff99mukesh agrawal
6157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpen) {
6167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
617a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
6187a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
6197a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
6227a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
6236ab23a9d4526686406d50081853639540b22213aPaul Stewart  GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
6247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
6257a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify service type", e.message());
6267a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6277a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
6297a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
630a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
6317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
6327a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify SSID", e.message());
6337a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6347a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6357a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
6367a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
6377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  GetOpenService(
638a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kTypeWifi, "123456789012345678901234567890123",
639a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      flimflam::kModeManaged, &e);
6407a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
6417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too long", e.message());
6427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6437a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
6457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
646a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
6477a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidNetworkName, e.type());
6487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("SSID is too short", e.message());
6497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
6527a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
653a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
6547a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
6557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("service mode is unsupported", e.message());
6567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
6597a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
660a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
6617a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
6627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSN) {
6657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
666a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
667a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, "secure password", &e);
6687a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
6697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
6727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
673a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
674a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityRsn, NULL, &e);
6757a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
6767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify passphrase", e.message());
6777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
6807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
681a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
682a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             NULL, &e);
6837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kNotSupported, e.type());
6847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("security mode is unsupported", e.message());
6857a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6867a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6877a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
6887a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
689a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
690a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, NULL, &e);
6917a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidArguments, e.type());
6927a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ("must specify passphrase", e.message());
6937a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
6947a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
6957a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
6967a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
697a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
698a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "", &e);
6997a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
7007a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7017a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7027a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
7037a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
704a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
705a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcde", &e);
7067a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7077a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7087a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7097a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
7107a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
711a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
712a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "abcdefghijklm", &e);
7137a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7147a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7157a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7167a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
7177a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
718a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
719a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:abcdefghijklm", &e);
7207a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7217a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7227a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7237a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
7247a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
725a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
726a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405", &e);
7277a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7287a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7297a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7307a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
7317a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
732a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
733a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "O102030405", &e);
7347a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
7357a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7367a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7377a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
7387a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
739a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
740a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:O102030405", &e);
7417a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
7427a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7437a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7447a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
7457a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
746a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
747a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "1:0xO102030405", &e);
7487a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
7497a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7507a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7517a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
7527a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
753a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
754a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0xO102030405", &e);
7557a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
7567a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7577a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7587a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
7597a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
760a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
761a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
7627a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7637a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7647a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7657a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
7667a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
767a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
768a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
7697a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7707a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7717a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7727a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
7737a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
774a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
775a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
7767a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7777a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7787a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7797a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawalTEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
7807a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  Error e;
781a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
782a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
7837a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7847a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal}
7857a4e4008dc09effe39c94a5f9575644a79ee1388mukesh agrawal
7868ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceSuccessTest : public WiFiMainTest {};
7878ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalclass WiFiGetServiceFailureTest : public WiFiMainTest {};
7888ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
7898ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceSuccessTest, Passphrase) {
7908ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
791a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
792a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
7938ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_TRUE(e.IsSuccess());
7948ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
7958ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
7968ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalTEST_P(WiFiGetServiceFailureTest, Passphrase) {
7978ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  Error e;
798a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
799a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart             flimflam::kSecurityWpa, GetParam().c_str(), &e);
8008ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal  EXPECT_EQ(Error::kInvalidPassphrase, e.type());
8018ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal}
8028ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
8038ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
8048ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTestInstance,
8058ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceSuccessTest,
8068ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
8078ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
8088ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
8098ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        // subtle: invalid length for hex key, but valid as ascii passphrase
8108ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen-1, '1'),
8118ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen, '1')));
8128ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
8138ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawalINSTANTIATE_TEST_CASE_P(
8148ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTestInstance,
8158ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    WiFiGetServiceFailureTest,
8168ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal    Values(
8178ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
8188ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
8198ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal        string(IEEE_80211::kWPAHexLen+1, '1')));
8208ede052be929e07a8fa5d46af1996242bf5f7fc8mukesh agrawal
8216ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWEP) {
8226ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
8236ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
8246ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
825a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
8266ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityWep, "abcde", &e);
8276ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
8286ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
8296ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
8306ab23a9d4526686406d50081853639540b22213aPaul Stewart
831a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
832a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityWep).get());
833a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
834a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                           flimflam::kSecurityWpa).get());
8356ab23a9d4526686406d50081853639540b22213aPaul Stewart}
8366ab23a9d4526686406d50081853639540b22213aPaul Stewart
8376ab23a9d4526686406d50081853639540b22213aPaul StewartTEST_F(WiFiMainTest, FindServiceWPA) {
8386ab23a9d4526686406d50081853639540b22213aPaul Stewart  const string ssid("an_ssid");
8396ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
8406ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
841a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
8426ab23a9d4526686406d50081853639540b22213aPaul Stewart               flimflam::kSecurityRsn, "abcdefgh", &e);
8436ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
8446ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
8456ab23a9d4526686406d50081853639540b22213aPaul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
846a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
847a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityWpa));
8486ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(wpa_service.get());
849a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
850a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityRsn));
8516ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_TRUE(rsn_service.get());
8526ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), rsn_service.get());
853a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
854a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                                            flimflam::kSecurityPsk));
8556ab23a9d4526686406d50081853639540b22213aPaul Stewart  EXPECT_EQ(wpa_service.get(), psk_service.get());
8566ab23a9d4526686406d50081853639540b22213aPaul Stewart  // Indirectly test FindService by doing a GetService on something that
8576ab23a9d4526686406d50081853639540b22213aPaul Stewart  // already exists.
8586ab23a9d4526686406d50081853639540b22213aPaul Stewart  {
8596ab23a9d4526686406d50081853639540b22213aPaul Stewart    Error e;
8606ab23a9d4526686406d50081853639540b22213aPaul Stewart    WiFiServiceRefPtr wpa_service2(
861a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
862a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        flimflam::kModeManaged, flimflam::kSecurityWpa,
863a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        "abcdefgh", false, &e));
8646ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_TRUE(e.IsSuccess());
8656ab23a9d4526686406d50081853639540b22213aPaul Stewart    EXPECT_EQ(wpa_service.get(), wpa_service2.get());
8666ab23a9d4526686406d50081853639540b22213aPaul Stewart  }
8676ab23a9d4526686406d50081853639540b22213aPaul Stewart}
8686ab23a9d4526686406d50081853639540b22213aPaul Stewart
869ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartMATCHER_P(HasHiddenSSID, ssid, "") {
870a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  map<string, DBus::Variant>::const_iterator it =
871ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      arg.find(wpa_supplicant::kPropertyScanSSIDs);
872ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  if (it == arg.end()) {
873ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart    return false;
874ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  }
875ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
876ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const DBus::Variant &ssids_variant = it->second;
877ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
878ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  const ByteArrays &ssids = it->second.operator ByteArrays();
879ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // A valid Scan containing a single hidden SSID should contain
880ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // two SSID entries: one containing the SSID we are looking for,
881ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // and an empty entry, signifying that we also want to do a
882ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  // broadcast probe request for all non-hidden APs as well.
883ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  return ssids.size() == 2 &&
884ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      string(ssids[0].begin(), ssids[0].end()) == ssid &&
885ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      ssids[1].empty();
886ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
887ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
888ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul StewartTEST_F(WiFiMainTest, ScanHidden) {
889ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
890ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
891ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .Times(AnyNumber())
892ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart      .WillRepeatedly(Throw(
893ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart          DBus::Error(
894ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "fi.w1.wpa_supplicant1.InterfaceUnknown",
895ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
896a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
897a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a hidden, favorite service.
898a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
899a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
900a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
901a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
902a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
903a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
90400917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal    service->MakeFavorite();
905a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
906a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
907a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a hidden, non-favorite service.
908a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
909a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
910a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
911a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, true, &e);
912a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
913a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(service->hidden_ssid());
914a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
915a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  {
916a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    // Create a non-hidden, favorite service.
917a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    Error e;
918a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    WiFiServiceRefPtr service =
919a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart        GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
920a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                        NULL, NULL, false, &e);
921a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_TRUE(e.IsSuccess());
922a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart    EXPECT_FALSE(service->hidden_ssid());
92300917ceafbc28599391bfcdd5837faf6d63fec32mukesh agrawal    service->MakeFavorite();
924a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  }
925a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
926ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  StartWiFi();
927ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart  dispatcher_.DispatchPendingEvents();
928ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart}
929ced6a0b2c2c3952ba79e10709345b573d2e06af6Paul Stewart
9307ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, InitialSupplicantState) {
9317ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
9327ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
9337ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
9347ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeNoService) {
9357ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // State change should succeed even if there is no pending Service.
9367ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
9377ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
9387ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
9397ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
9407ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeWithService) {
9417ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Forward transition should trigger a Service state change.
9427ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
9437ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
9447ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
9457ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
9467ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
9477ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
9487ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
9497ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
9507ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
9517ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
9527ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
9537ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawalTEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
9547ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Some backwards transitions should not trigger a Service state change.
9557ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Supplicant state should still be updated, however.
9567ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  StartWiFi();
9577ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  dispatcher_.DispatchPendingEvents();
9587ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  MockWiFiServiceRefPtr service = MakeMockService();
9597ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  InitiateConnect(service);
9607ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
9617ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_CALL(*service.get(), SetState(_)).Times(0);
9627ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
9637ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
9647ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal            GetSupplicantState());
9657ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // Verify expectations now, because WiFi may report other state changes
9667ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  // when WiFi is Stop()-ed (during TearDown()).
9677ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal  Mock::VerifyAndClearExpectations(service.get());
9687ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal}
9697ec7131cbc4e192ea044cf761317e71699f7c190mukesh agrawal
970a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
971a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
972a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
973a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(set<string>()));
974a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
975a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
976a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
977a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
978a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
979a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
980a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
981a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "Hidden" property.
982a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
983a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
984a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
985a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
986a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
987a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
988a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
989a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
990a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
991a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // "Hidden" property set to "false".
992a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
993a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
994a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
995a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
996a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
997a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
998a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
999a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1000a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1001a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  // Missing "SSID" property.
1002a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1003a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart      .WillOnce(Return(false));
1004a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1005a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1006a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1007a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1008a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1009a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1010a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1011a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, "an_ssid", &id);
1012a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  Error e;
1013a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1014a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  ASSERT_TRUE(e.IsSuccess());
1015a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_FALSE(LoadHiddenServices(&storage));
1016a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1017a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
1018a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul StewartTEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1019a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  StrictMock<MockStore> storage;
1020a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string ssid("an_ssid");
1021a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  string id;
1022a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  SetupHiddenStorage(&storage, ssid, &id);
1023a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(LoadHiddenServices(&storage));
1024a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1025a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart  EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1026a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart                          flimflam::kSecurityNone).get());
1027a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart}
1028a41e38d57e4fa37bd2c8de6447890b4e1951acb7Paul Stewart
10291590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
10301590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
10311590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
10321590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10331590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
10341590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
10351590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
10361590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10371590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
10381590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
10391590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
10401590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
10411590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetPendingService().get());
10421590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10431590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
10441590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10451590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
10461590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service, GetCurrentService().get());
10471590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
10481590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10491590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
10501590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateIdle, service->state());
10511590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetCurrentService().get());
10521590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(NULL, GetPendingService().get());
10531590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
10541590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10551590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
10561590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
10571590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
10581590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
10591590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
10601590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10611590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handles used in this test ("ap1", "ap2") are
10621590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // not intended to reflect the format used by supplicant. They're
10631590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // just convenient for testing.
10641590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10651590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
10661590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
10671590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
10681590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
10691590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
10701590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service1);
10711590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap1");
10721590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10731590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service1.get(), GetCurrentService().get());
10741590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10751590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("ap2");
10761590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10771590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service2.get(), GetCurrentService().get());
10781590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateIdle, service1->state());
10791590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service2->state());
10801590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
10811590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10821590839e44a0e922d4763003a35dbd493509b705mukesh agrawalTEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
10831590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
10841590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
10851590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10861590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // Note that the BSS handle used in this test ("an_ap") is not
10871590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // intended to reflect the format used by supplicant. It's just
10881590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  // convenient for testing.
10891590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
10901590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  StartWiFi();
10911590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
10921590839e44a0e922d4763003a35dbd493509b705mukesh agrawal            kNetworkModeInfrastructure);
10931590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  InitiateConnect(service);
10941590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportCurrentBSSChanged("an_ap");
10951590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
10961590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(service.get(), GetCurrentService().get());
10971590839e44a0e922d4763003a35dbd493509b705mukesh agrawal  EXPECT_EQ(Service::kStateConfiguring, service->state());
10981590839e44a0e922d4763003a35dbd493509b705mukesh agrawal}
10991590839e44a0e922d4763003a35dbd493509b705mukesh agrawal
1100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
1101