15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/geolocation/wifi_data_provider_linux.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_object_proxy.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Unused;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GeolocationWifiDataProviderLinuxTest : public testing::Test {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock bus.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dbus::Bus::Options options;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options.bus_type = dbus::Bus::SYSTEM;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_bus_ = new dbus::MockBus(options);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock proxy that behaves as NetworkManager.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_network_manager_proxy_ =
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new dbus::MockObjectProxy(
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_bus_.get(),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "org.freedesktop.NetworkManager",
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dbus::ObjectPath("/org/freedesktop/NetworkManager"));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set an expectation so mock_network_manager_proxy_'s
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CallMethodAndBlock() will use CreateNetworkManagerProxyResponse()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to return responses.
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*mock_network_manager_proxy_.get(),
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                MockCallMethodAndBlock(_, _))
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        .WillRepeatedly(Invoke(this,
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               &GeolocationWifiDataProviderLinuxTest::
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   CreateNetworkManagerProxyResponse));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock proxy that behaves as NetworkManager/Devices/0.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_device_proxy_ =
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new dbus::MockObjectProxy(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_bus_.get(),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "org.freedesktop.NetworkManager",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dbus::ObjectPath("/org/freedesktop/NetworkManager/Devices/0"));
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*mock_device_proxy_.get(), MockCallMethodAndBlock(_, _))
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Invoke(
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             this,
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             &GeolocationWifiDataProviderLinuxTest::CreateDeviceProxyResponse));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create a mock proxy that behaves as NetworkManager/AccessPoint/0.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_access_point_proxy_ =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new dbus::MockObjectProxy(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_bus_.get(),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "org.freedesktop.NetworkManager",
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dbus::ObjectPath("/org/freedesktop/NetworkManager/AccessPoint/0"));
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*mock_access_point_proxy_.get(), MockCallMethodAndBlock(_, _))
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        .WillRepeatedly(Invoke(this,
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               &GeolocationWifiDataProviderLinuxTest::
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   CreateAccessPointProxyResponse));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set an expectation so mock_bus_'s GetObjectProxy() for the given
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // service name and the object path will return
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mock_network_manager_proxy_.
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        *mock_bus_.get(),
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        GetObjectProxy("org.freedesktop.NetworkManager",
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       dbus::ObjectPath("/org/freedesktop/NetworkManager")))
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_network_manager_proxy_.get()));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Likewise, set an expectation for mock_device_proxy_.
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        *mock_bus_.get(),
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        GetObjectProxy(
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            "org.freedesktop.NetworkManager",
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            dbus::ObjectPath("/org/freedesktop/NetworkManager/Devices/0")))
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_device_proxy_.get()))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_device_proxy_.get()));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Likewise, set an expectation for mock_access_point_proxy_.
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        *mock_bus_.get(),
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        GetObjectProxy(
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            "org.freedesktop.NetworkManager",
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            dbus::ObjectPath("/org/freedesktop/NetworkManager/AccessPoint/0")))
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(mock_access_point_proxy_.get()));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ShutdownAndBlock() should be called.
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the wlan API with the mock bus object injected.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wifi_provider_linux_ = new WifiDataProviderLinux;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wlan_api_.reset(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wifi_provider_linux_->NewWlanApiForTesting(mock_bus_.get()));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(wlan_api_.get());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DeviceDataProviderImplBase, a super class of WifiDataProviderLinux,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requires a message loop to be present. message_loop_ is defined here,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as it should outlive wifi_provider_linux_.
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockBus> mock_bus_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_network_manager_proxy_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_access_point_proxy_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<dbus::MockObjectProxy> mock_device_proxy_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WifiDataProviderLinux>  wifi_provider_linux_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WifiDataProviderCommon::WlanApiInterface> wlan_api_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a response for |mock_network_manager_proxy_|.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dbus::Response* CreateNetworkManagerProxyResponse(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MethodCall* method_call,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Unused) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method_call->GetInterface() == "org.freedesktop.NetworkManager" &&
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        method_call->GetMember() == "GetDevices") {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The list of devices is asked. Return the object path.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<dbus::ObjectPath> object_paths;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      object_paths.push_back(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          dbus::ObjectPath("/org/freedesktop/NetworkManager/Devices/0"));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dbus::MessageWriter writer(response.get());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendArrayOfObjectPaths(object_paths);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return response.release();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unexpected method call: " << method_call->ToString();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a response for |mock_device_proxy_|.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* CreateDeviceProxyResponse(dbus::MethodCall* method_call,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Unused) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method_call->GetInterface() == DBUS_INTERFACE_PROPERTIES &&
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        method_call->GetMember() == "Get") {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MessageReader reader(method_call);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string interface_name;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string property_name;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (reader.PopString(&interface_name) &&
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reader.PopString(&property_name)) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // The device type is asked. Respond that the device type is wifi.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dbus::MessageWriter writer(response.get());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // This matches NM_DEVICE_TYPE_WIFI in wifi_data_provider_linux.cc.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const int kDeviceTypeWifi = 2;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        writer.AppendVariantOfUint32(kDeviceTypeWifi);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return response.release();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (method_call->GetInterface() ==
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "org.freedesktop.NetworkManager.Device.Wireless" &&
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               method_call->GetMember() == "GetAccessPoints") {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The list of access points is asked. Return the object path.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dbus::MessageWriter writer(response.get());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<dbus::ObjectPath> object_paths;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      object_paths.push_back(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          dbus::ObjectPath("/org/freedesktop/NetworkManager/AccessPoint/0"));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      writer.AppendArrayOfObjectPaths(object_paths);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return response.release();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unexpected method call: " << method_call->ToString();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a response for |mock_access_point_proxy_|.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbus::Response* CreateAccessPointProxyResponse(dbus::MethodCall* method_call,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 Unused) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (method_call->GetInterface() == DBUS_INTERFACE_PROPERTIES &&
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        method_call->GetMember() == "Get") {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dbus::MessageReader reader(method_call);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string interface_name;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string property_name;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (reader.PopString(&interface_name) &&
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reader.PopString(&property_name)) {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dbus::MessageWriter writer(response.get());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (property_name == "Ssid") {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const uint8 kSsid[] = {0x74, 0x65, 0x73, 0x74};  // "test"
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dbus::MessageWriter variant_writer(response.get());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          writer.OpenVariant("ay", &variant_writer);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          variant_writer.AppendArrayOfBytes(kSsid, arraysize(kSsid));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          writer.CloseContainer(&variant_writer);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (property_name == "HwAddress") {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // This will be converted to "00-11-22-33-44-55".
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const std::string kMacAddress = "00:11:22:33:44:55";
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          writer.AppendVariantOfString(kMacAddress);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (property_name == "Strength") {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // This will be converted to -50.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const uint8 kStrength = 100;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          writer.AppendVariantOfByte(kStrength);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else if (property_name == "Frequency") {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // This will be converted to channel 4.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          const uint32 kFrequency = 2427;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          writer.AppendVariantOfUint32(kFrequency);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return response.release();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Unexpected method call: " << method_call->ToString();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeolocationWifiDataProviderLinuxTest, GetAccessPointData) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WifiData::AccessPointDataSet access_point_data_set;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(wlan_api_->GetAccessPointData(&access_point_data_set));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, access_point_data_set.size());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccessPointData access_point_data = *access_point_data_set.begin();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the contents of the access point data.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The expected values come from CreateAccessPointProxyResponse() above.
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("test", base::UTF16ToUTF8(access_point_data.ssid));
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("00-11-22-33-44-55",
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::UTF16ToUTF8(access_point_data.mac_address));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-50, access_point_data.radio_signal_strength);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, access_point_data.channel);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
233