wifi_unittest.cc revision de29fa8d95092f28548b5e4537a6c61e21ae760b
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>
9f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
10853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <map>
11853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <string>
12853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <vector>
13853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
14dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include <base/memory/scoped_ptr.h>
153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_number_conversions.h>
163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include <base/string_util.h>
17853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <dbus-c++/dbus.h>
18853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include <chromeos/dbus/service_constants.h>
197156c923c9a9d2240ea9c62045337ac8c8f89e57Chris Masone#include <gmock/gmock.h>
202ae797d040b7261a5619c750e07037566bcb542bChris Masone#include <gtest/gtest.h>
21853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
22853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/dbus_adaptor.h"
23853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/manager.h"
24853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/mock_device.h"
25f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_config.h"
26f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal#include "shill/mock_dhcp_provider.h"
272ae797d040b7261a5619c750e07037566bcb542bChris Masone#include "shill/mock_manager.h"
283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_interface_proxy.h"
293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/mock_supplicant_process_proxy.h"
30dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal#include "shill/nice_mock_control.h"
31853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone#include "shill/property_store_unittest.h"
323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/proxy_factory.h"
333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi_endpoint.h"
343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal#include "shill/wifi.h"
353239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal#include "shill/wifi_service.h"
36853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
37853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::map;
38853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::string;
39853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing std::vector;
40853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::_;
413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::AnyNumber;
423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::DefaultValue;
433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::InSequence;
44dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawalusing ::testing::NiceMock;
45853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Return;
46853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masoneusing ::testing::Test;
473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalusing ::testing::Throw;
48853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
49853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masonenamespace shill {
50853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiPropertyTest : public PropertyStoreTest {
52853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone public:
533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiPropertyTest()
542176a88f197d802924d2a83d368e3efab7a6be4bChris Masone      : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
55853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  }
563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiPropertyTest() {}
57853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
58853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone protected:
59853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  DeviceRefPtr device_;
60853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone};
61853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Contains) {
63de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
64de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal  EXPECT_FALSE(device_->store().Contains(""));
65853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
66853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiPropertyTest, Dispatch) {
68a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
69a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
70de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
71a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kBgscanMethodProperty,
72a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kStringV,
73a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
74a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
75a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
76a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
77a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    EXPECT_TRUE(DBusAdaptor::DispatchOnType(
78de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal        device_->mutable_store(),
79a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        flimflam::kBgscanSignalThresholdProperty,
80a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        PropertyStoreTest::kInt32V,
81a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone        &error));
82a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
83a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
84a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
85de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
86a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            flimflam::kScanIntervalProperty,
87a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            PropertyStoreTest::kUint16V,
88a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                            &error));
89a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
90853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone  // Ensure that an attempt to write a R/O property returns InvalidArgs error.
91a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  {
92a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone    ::DBus::Error error;
93de29fa8d95092f28548b5e4537a6c61e21ae760bmukesh agrawal    EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
94a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             flimflam::kScanningProperty,
95a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             PropertyStoreTest::kBoolV,
96a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone                                             &error));
979d779936d8f8c2d74b30883e2a2622c4207fe797Chris Masone    EXPECT_EQ(invalid_args(), error.name());
98a8a2c25df27d77f278511769f0c9029b03dff053Chris Masone  }
99853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}
100853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone
1013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalclass WiFiMainTest : public Test {
1023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal public:
1033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiMainTest()
1043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      : manager_(&control_interface_, NULL, NULL),
105626719f89881a949d8b5a8fa808beb924496489fChris Masone        wifi_(new WiFi(&control_interface_,
1063239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal                       &dispatcher_,
107626719f89881a949d8b5a8fa808beb924496489fChris Masone                       &manager_,
108626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceName,
109626719f89881a949d8b5a8fa808beb924496489fChris Masone                       kDeviceAddress,
110626719f89881a949d8b5a8fa808beb924496489fChris Masone                       0)),
111dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
112dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        supplicant_interface_proxy_(
113dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal            new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
114f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal        dhcp_config_(new MockDHCPConfig(&control_interface_,
115f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dispatcher_,
116f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &dhcp_provider_,
117f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        kDeviceName,
118f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal                                        &glib_)),
119dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal        proxy_factory_(this) {
1203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ProxyFactory::set_factory(&proxy_factory_);
1213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
1223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  virtual ~WiFiMainTest() {
1243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // must Stop WiFi instance, to clear its list of services.
1253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // otherwise, the WiFi instance will not be deleted. (because
1263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    // services reference a WiFi instance, creating a cycle.)
1273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
1283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
130f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  virtual void SetUp() {
131f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->set_dhcp_provider(&dhcp_provider_);
132f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
133f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
1343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
1353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  class TestProxyFactory : public ProxyFactory {
1363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   public:
1377355ce1937c504d836a303ac809bd436272212b3Paul Stewart    explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
1383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
1403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const char *dbus_path, const char *dbus_addr) {
141dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_process_proxy_.release();
1423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
1453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const WiFiRefPtr &wifi,
1463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const DBus::Path &object_path,
1473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        const char *dbus_addr) {
148dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      return test_->supplicant_interface_proxy_.release();
1493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    }
1503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal   private:
152dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    WiFiMainTest *test_;
1533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  };
1543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
1553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::EndpointMap &GetEndpointMap() {
1563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->endpoint_by_bssid_;
1573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  const WiFi::ServiceMap &GetServiceMap() {
1593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->service_by_private_id_;
1603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // note: the tests need the proxies referenced by WiFi (not the
1623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // proxies instantiated by WiFiMainTest), to ensure that WiFi
1633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // sets up its proxies correctly.
1643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
1653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_process_proxy_.get();
1663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
1683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    return wifi_->supplicant_interface_proxy_.get();
1693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1703239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  void InitiateConnect(WiFiService *service) {
1713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->ConnectTo(service);
1723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
173f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  bool IsLinkUp() {
174f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    return wifi_->link_up_;
175f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
1763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportBSS(const ::DBus::Path &bss_path,
1773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &ssid,
1783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const string &bssid,
1793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 int16_t signal_strength,
1803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                 const char *mode);
181f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  void ReportLinkUp() {
182f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
183f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  }
1843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void ReportScanDone() {
185dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    wifi_->ScanDoneTask();
1863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1873195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StartWiFi() {
1883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Start();
1893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  void StopWiFi() {
1913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    wifi_->Stop();
1923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
1933239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  MockManager *manager() {
1943239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return &manager_;
1953239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
1963239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  const WiFiConstRefPtr wifi() const {
1973239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    return wifi_;
1983239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  }
1993239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal
2003239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  EventDispatcher dispatcher_;
2013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
203dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  NiceMockControl control_interface_;
204f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockGLib glib_;
2052ae797d040b7261a5619c750e07037566bcb542bChris Masone  MockManager manager_;
2063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  WiFiRefPtr wifi_;
2073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // protected fields interspersed between private fields, due to
2093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  // initialization order
2103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal protected:
2113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kDeviceName[];
212626719f89881a949d8b5a8fa808beb924496489fChris Masone  static const char kDeviceAddress[];
2133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeAdHoc[];
2143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  static const char kNetworkModeInfrastructure[];
2153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
216dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
217dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
218f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  MockDHCPProvider dhcp_provider_;
219f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  scoped_refptr<MockDHCPConfig> dhcp_config_;
2203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal private:
2223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  TestProxyFactory proxy_factory_;
2233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal};
2243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kDeviceName[] = "wlan0";
226626719f89881a949d8b5a8fa808beb924496489fChris Masoneconst char WiFiMainTest::kDeviceAddress[] = "00:01:02:03:04:05";
2273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
2283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalconst char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
2293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalvoid WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
2313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &ssid,
2323195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const string &bssid,
2333195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             int16_t signal_strength,
2343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal                             const char *mode) {
2353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  map<string, ::DBus::Variant> bss_properties;
2363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
2383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["SSID"].writer());
2393195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << vector<uint8_t>(ssid.begin(), ssid.end());
2403195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2413195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
2423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    string bssid_nosep;
2433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    vector<uint8_t> bssid_bytes;
2443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    RemoveChars(bssid, ":", &bssid_nosep);
2453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    base::HexStringToBytes(bssid_nosep, &bssid_bytes);
2463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::MessageIter writer(bss_properties["BSSID"].writer());
2483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    writer << bssid_bytes;
2493195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
2503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Signal"].writer().append_int16(signal_strength);
2513195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  bss_properties["Mode"].writer().append_string(mode);
2523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  wifi_->BSSAdded(bss_path, bss_properties);
2533195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2543195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2553195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
2563195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
2573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
2583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2603195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
2613195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
2623195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2633195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2643195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, CleanStart) {
2653195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
2663195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
2673195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
2683195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
2693195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
2703195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceUnknown",
2713195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
2723195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
2733195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2743239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2753195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2763195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2773195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Restart) {
2783195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
2793195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .Times(AnyNumber())
2803195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      .WillRepeatedly(Throw(
2813195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal          DBus::Error(
2823195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "fi.w1.wpa_supplicant1.InterfaceExists",
2833195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal              "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
2843195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
2853195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
2863195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2873239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  dispatcher_.DispatchPendingEvents();
2883195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2893195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2903195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, StartClearsState) {
2913195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
2923195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
2933195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2943195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
2953195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
2963195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResults) {
2973195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
2983195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
2993195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3003195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
3013195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3023195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
3033195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3043195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
3053195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
3063195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(5, GetEndpointMap().size());
3073195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
3083195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3093195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanResultsWithUpdates) {
3103195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
3113195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
3123195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3133195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
3143195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3153195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
3163195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3173195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
3183195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
3193195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(3, GetEndpointMap().size());
3203195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000"));
3213195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second->
3223195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal            signal_strength());
3233195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
3243195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3253195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, ScanCompleted) {
3263195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
3273195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
3283195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3293195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
3303195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS(
3313195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal      "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
3323239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal  EXPECT_CALL(*manager(), RegisterService(_))
3333239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal      .Times(3);
3343195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
3353195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  EXPECT_EQ(3, GetServiceMap().size());
3363195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
3373195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3383195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawalTEST_F(WiFiMainTest, Connect) {
339dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal  MockSupplicantInterfaceProxy &supplicant_interface_proxy =
340dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal      *supplicant_interface_proxy_;
341dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal
3423195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  StartWiFi();
3433195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
3443195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  ReportScanDone();
3453195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
3463195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  {
3473195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    InSequence s;
3483195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal    DBus::Path fake_path("/fake/path");
3493239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    WiFiService *service(GetServiceMap().begin()->second);
3503195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
351dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
3523195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal        .WillOnce(Return(fake_path));
353dc42bb32d20da8ddd2ace08f171f9adf3ec1c847mukesh agrawal    EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
3543239932e4a0a92fec52d88860081cbbb003eabb0mukesh agrawal    InitiateConnect(service);
355f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal    EXPECT_EQ(static_cast<Service *>(service),
356f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal              wifi()->selected_service_.get());
3573195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal  }
3583195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal}
3593195024a8c5a5ec9b6d54c18c9788809814d4e25mukesh agrawal
360f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawalTEST_F(WiFiMainTest, LinkEvent) {
361f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  EXPECT_FALSE(IsLinkUp());
362f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
363f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal      WillOnce(Return(dhcp_config_));
364f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal  ReportLinkUp();
365f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal}
366f2f68a50aabcde256cabad0041c357cbacaeb3e0mukesh agrawal
367853b81b19ddcd39561df2bde9c61b7106a9ee9d6Chris Masone}  // namespace shill
368