// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill_manager_client.h"
#include "chromeos/network/geolocation_handler.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
class GeolocationHandlerTest : public testing::Test {
public:
GeolocationHandlerTest() : manager_test_(NULL) {
}
virtual ~GeolocationHandlerTest() {
}
virtual void SetUp() OVERRIDE {
// Initialize DBusThreadManager with a stub implementation.
DBusThreadManager::Initialize();
// Get the test interface for manager / device.
manager_test_ =
DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface();
ASSERT_TRUE(manager_test_);
geolocation_handler_.reset(new GeolocationHandler());
geolocation_handler_->Init();
message_loop_.RunUntilIdle();
}
virtual void TearDown() OVERRIDE {
geolocation_handler_.reset();
DBusThreadManager::Shutdown();
}
bool GetWifiAccessPoints() {
return geolocation_handler_->GetWifiAccessPoints(
&wifi_access_points_, NULL);
}
void AddAccessPoint(int idx) {
base::DictionaryValue properties;
std::string mac_address =
base::StringPrintf("%02X:%02X:%02X:%02X:%02X:%02X",
idx, 0, 0, 0, 0, 0);
std::string channel = base::StringPrintf("%d", idx);
std::string strength = base::StringPrintf("%d", idx * 10);
properties.SetStringWithoutPathExpansion(
shill::kGeoMacAddressProperty, mac_address);
properties.SetStringWithoutPathExpansion(
shill::kGeoChannelProperty, channel);
properties.SetStringWithoutPathExpansion(
shill::kGeoSignalStrengthProperty, strength);
manager_test_->AddGeoNetwork(shill::kTypeWifi, properties);
message_loop_.RunUntilIdle();
}
protected:
base::MessageLoopForUI message_loop_;
scoped_ptr<GeolocationHandler> geolocation_handler_;
ShillManagerClient::TestInterface* manager_test_;
WifiAccessPointVector wifi_access_points_;
private:
DISALLOW_COPY_AND_ASSIGN(GeolocationHandlerTest);
};
TEST_F(GeolocationHandlerTest, NoAccessPoints) {
// Inititial call should return false.
EXPECT_FALSE(GetWifiAccessPoints());
message_loop_.RunUntilIdle();
// Second call should return false since there are no devices.
EXPECT_FALSE(GetWifiAccessPoints());
}
TEST_F(GeolocationHandlerTest, OneAccessPoint) {
// Add an acces point.
AddAccessPoint(1);
message_loop_.RunUntilIdle();
// Inititial call should return false and request access points.
EXPECT_FALSE(GetWifiAccessPoints());
message_loop_.RunUntilIdle();
// Second call should return true since we have an access point.
EXPECT_TRUE(GetWifiAccessPoints());
ASSERT_EQ(1u, wifi_access_points_.size());
EXPECT_EQ("01:00:00:00:00:00", wifi_access_points_[0].mac_address);
EXPECT_EQ(1, wifi_access_points_[0].channel);
}
TEST_F(GeolocationHandlerTest, MultipleAccessPoints) {
// Add several acces points.
AddAccessPoint(1);
AddAccessPoint(2);
AddAccessPoint(3);
message_loop_.RunUntilIdle();
// Inititial call should return false and request access points.
EXPECT_FALSE(GetWifiAccessPoints());
message_loop_.RunUntilIdle();
// Second call should return true since we have an access point.
EXPECT_TRUE(GetWifiAccessPoints());
ASSERT_EQ(3u, wifi_access_points_.size());
EXPECT_EQ("02:00:00:00:00:00", wifi_access_points_[1].mac_address);
EXPECT_EQ(3, wifi_access_points_[2].channel);
}
} // namespace chromeos