wifi_unittest.cc revision dc42bb32d20da8ddd2ace08f171f9adf3ec1c847
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
7853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
8853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
9853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
10853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
11dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h>
123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h>
133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h>
14853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <dbus-c++/dbus.h>
15853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
16853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <gtest/gtest.h>
17853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <gmock/gmock.h>
18853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
19853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
20853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
21853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
24dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
25853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi.h"
29853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
30853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
31853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
32853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
33853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
37dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
38853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
39853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
41853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
42853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
43853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
45853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
47853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone      : device_(new WiFi(&control_interface_, NULL, NULL, "wifi", 0)) {
48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
50853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
51853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
52853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  DeviceRefPtr device_;
53853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
54853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
5627c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone  EXPECT_TRUE(device_->store()->Contains(flimflam::kNameProperty));
5727c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone  EXPECT_FALSE(device_->store()->Contains(""));
58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Dispatch) {
61a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
62a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
6327c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->store(),
64a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kBgscanMethodProperty,
65a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kStringV,
66a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
67a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
68a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
69a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
70a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    EXPECT_TRUE(DBusAdaptor::DispatchOnType(
7127c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone        device_->store(),
72a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
73a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
74a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
75a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
76a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
77a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
7827c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->store(),
79a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kScanIntervalProperty,
80a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kUint16V,
81a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
82a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
83853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
84a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
85a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
8627c4aa55b33d3a3836cf70c8f7094bce1c5ead8cChris Masone    EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->store(),
87a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             flimflam::kScanningProperty,
88a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             PropertyStoreTest::kBoolV,
89a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             &error));
90a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    EXPECT_EQ(invalid_args_, error.name());
91a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
92853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
93853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiMainTest : public Test {
953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiMainTest()
973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      : manager_(&control_interface_, NULL, NULL),
983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        wifi_(new WiFi(&control_interface_, NULL, &manager_, kDeviceName, 0)),
99dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
100dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
101dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
102dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        proxy_factory_(this) {
1033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ProxyFactory::set_factory(&proxy_factory_);
1043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
1053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiMainTest() {
1073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
1083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
1093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
1103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
1113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
1143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
1153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
116dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    TestProxyFactory(WiFiMainTest *test) : test_(test) {}
1173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
1193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const char *dbus_path, const char *dbus_addr) {
120dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
1213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
1243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const WiFiRefPtr &wifi,
1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const DBus::Path &object_path,
1263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const char *dbus_addr) {
127dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
1283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
131dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    WiFiMainTest *test_;
1323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
1333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
1353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->endpoint_by_bssid_;
1363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::ServiceMap &GetServiceMap() {
1383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->service_by_private_id_;
1393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
1413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // proxies instantiated by WiFiMainTest), to ensure that WiFi
1423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
1433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
1443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
1453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
1473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_interface_proxy_.get();
1483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void InitiateConnect(const WiFiService &service) {
1503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->ConnectTo(service);
1513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
1533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
1543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
1553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
1563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
1573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
158dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
1593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
1613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Start();
1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
1643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
1653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
168dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
1693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  Manager manager_;
1703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
1713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
1733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
1743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
1753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
1763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
1773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
1783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
179dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
180dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
1813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
1833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
1843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
1863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0";
1883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
1893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
1903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
1923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
1933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
1943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
1953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
1963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
1973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
1993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
2003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
2013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
2033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
2043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
2053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
2063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
2073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
2093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
2103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Signal"].writer().append_int16(signal_strength);
2123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Mode"].writer().append_string(mode);
2133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  wifi_->BSSAdded(bss_path, bss_properties);
2143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
2173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
2183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
2193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
2223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
2233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
2263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
2273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
2283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
2293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
2303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
2313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
2333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
2343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
2383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
2393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
2403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
2433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
2443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
2453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
2463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
2503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
2513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
2523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
2563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
2583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
2603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
2623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
2643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
2653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(5, GetEndpointMap().size());
2663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
2693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
2733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2743195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
2753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
2773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
2793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000"));
2803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second->
2813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal            signal_strength());
2823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
2853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
2873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
2913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(3, GetServiceMap().size());
2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
296dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
297dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
298dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
2993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
3003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
3013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
3043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
3053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
3063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
307dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
3083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
309dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
3103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InitiateConnect(*(GetServiceMap().begin()->second));
3113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
3133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
314853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
315