blob: ff2535ac61b0f9f3236c3a844918c353f8e96a86 [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 "peerd/manager_dbus_proxy.h"
#include <string>
#include <base/bind.h>
#include <chromeos/dbus_utils.h>
#include <dbus/mock_bus.h>
#include <dbus/mock_exported_object.h>
#include <dbus/property.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "peerd/dbus_constants.h"
#include "peerd/mock_manager.h"
using peerd::dbus_constants::kManagerExposeIpService;
using peerd::dbus_constants::kManagerInterface;
using peerd::dbus_constants::kManagerPing;
using peerd::dbus_constants::kManagerRemoveExposedService;
using peerd::dbus_constants::kManagerServicePath;
using peerd::dbus_constants::kManagerSetFriendlyName;
using peerd::dbus_constants::kManagerSetNote;
using peerd::dbus_constants::kManagerStartMonitoring;
using peerd::dbus_constants::kManagerStopMonitoring;
using peerd::dbus_constants::kPingResponse;
using std::string;
using std::unique_ptr;
using testing::AnyNumber;
using testing::Return;
using testing::_;
namespace {
unique_ptr<dbus::MethodCall> MakeMethodCall(const char* method_name) {
auto ret = unique_ptr<dbus::MethodCall>(
new dbus::MethodCall(kManagerInterface, method_name));
ret->SetSerial(123);
return ret;
}
void ExpectErrorWithString(const std::string& error_code,
const std::string& error_message,
const unique_ptr<dbus::Response>& response) {
dbus::ErrorResponse* error_response =
dynamic_cast<dbus::ErrorResponse*>(response.get());
ASSERT_TRUE(error_response != NULL) << "Expected error response, "
<< "but didn't get one.";
EXPECT_EQ(error_code, response->GetErrorName());
dbus::MessageReader reader(error_response);
ASSERT_TRUE(reader.HasMoreData());
std::string actual_error_message;
ASSERT_TRUE(reader.PopString(&actual_error_message));
ASSERT_FALSE(reader.HasMoreData());
EXPECT_EQ(error_message, actual_error_message);
}
} // namespace
namespace peerd {
class ManagerDBusProxyTest: public ::testing::Test {
public:
typedef void(Manager::*ManagerDBusHandler)(
dbus::MethodCall*, dbus::ExportedObject::ResponseSender);
virtual void SetUp() {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
mock_bus_ = new dbus::MockBus(options);
bus_ = mock_bus_; // Takes ownership.
// By default, don't worry about threading assertions.
EXPECT_CALL(*mock_bus_, AssertOnOriginThread()).Times(AnyNumber());
EXPECT_CALL(*mock_bus_, AssertOnDBusThread()).Times(AnyNumber());
// Use a mock exported object.
exported_object_ = new dbus::MockExportedObject(
mock_bus_,
dbus::ObjectPath(kManagerServicePath));
EXPECT_CALL(*mock_bus_,
GetExportedObject(dbus::ObjectPath(kManagerServicePath)))
.Times(1).WillOnce(Return(exported_object_.get()));
EXPECT_CALL(*exported_object_,
ExportMethod(dbus::kPropertiesInterface, _, _, _))
.Times(AnyNumber());
for (const char* method : {kManagerExposeIpService,
kManagerPing,
kManagerRemoveExposedService,
kManagerSetFriendlyName,
kManagerSetNote,
kManagerStartMonitoring,
kManagerStopMonitoring}) {
EXPECT_CALL(*exported_object_,
ExportMethod(kManagerInterface, method, _, _)).Times(1);
}
manager_.reset(new MockManager(bus_));
proxy_ = &manager_->proxy_;
proxy_->RegisterAsync(base::Bind(&ManagerDBusProxyTest::InitFinished,
base::Unretained(this)));
}
virtual void TearDown() {
EXPECT_CALL(*exported_object_, Unregister()).Times(1);
proxy_ = nullptr;
manager_.reset();
exported_object_ = nullptr;
mock_bus_ = nullptr;
bus_ = nullptr;
}
MOCK_METHOD1(InitFinished, void(bool));
scoped_refptr<dbus::Bus> bus_;
dbus::MockBus* mock_bus_;
scoped_refptr<dbus::MockExportedObject> exported_object_;
unique_ptr<MockManager> manager_;
ManagerDBusProxy* proxy_;
};
TEST_F(ManagerDBusProxyTest, HandleStartMonitoring_NoArgs) {
auto method_call = MakeMethodCall(kManagerStartMonitoring);
}
TEST_F(ManagerDBusProxyTest, StartMonitoring_ReturnsString) {
auto method_call = MakeMethodCall(kManagerStartMonitoring);
}
TEST_F(ManagerDBusProxyTest, HandleStopMonitoring_NoArgs) {
auto method_call = MakeMethodCall(kManagerStopMonitoring);
}
TEST_F(ManagerDBusProxyTest, HandleStopMonitoring_ExtraArgs) {
auto method_call = MakeMethodCall(kManagerStopMonitoring);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_NoArgs) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_OnlyServiceId) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_MalformedIps) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_MissingServiceDict) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_MissingOptionsDict) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_ReturnsServiceToken) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleExposeIpService_ExtraArgs) {
auto method_call = MakeMethodCall(kManagerExposeIpService);
}
TEST_F(ManagerDBusProxyTest, HandleRemoveExposedService_NoArgs) {
auto method_call = MakeMethodCall(kManagerRemoveExposedService);
}
TEST_F(ManagerDBusProxyTest, HandleRemoveExposedService_ExtraArgs) {
auto method_call = MakeMethodCall(kManagerRemoveExposedService);
}
TEST_F(ManagerDBusProxyTest, HandleSetFriendlyName_NoArgs) {
auto method_call = MakeMethodCall(kManagerSetFriendlyName);
}
TEST_F(ManagerDBusProxyTest, HandleSetFriendlyName_ExtraArgs) {
auto method_call = MakeMethodCall(kManagerSetFriendlyName);
}
TEST_F(ManagerDBusProxyTest, HandleSetNote_NoArgs) {
auto method_call = MakeMethodCall(kManagerSetNote);
}
TEST_F(ManagerDBusProxyTest, HandleSetNote_ExtraArgs) {
auto method_call = MakeMethodCall(kManagerSetNote);
}
TEST_F(ManagerDBusProxyTest, HandlePing_ReturnsHelloWorld) {
EXPECT_EQ(kPingResponse, proxy_->HandlePing(nullptr));
}
TEST_F(ManagerDBusProxyTest, HandlePing_WithArgs) {
auto method_call = MakeMethodCall(kManagerPing);
dbus::MessageWriter writer(method_call.get());
writer.AppendString("Ping takes no args");
auto response = chromeos::dbus_utils::CallMethod(proxy_->dbus_object_,
method_call.get());
ExpectErrorWithString(DBUS_ERROR_INVALID_ARGS,
"Too many parameters in a method call",
response);
}
} // namespace peerd