blob: 58e0863f71685cf2510cf18e54ee04a9fe26c155 [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 "chromeos-dbus-bindings/adaptor_generator.h"
#include <string>
#include <vector>
#include <base/file_util.h>
#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
#include "chromeos-dbus-bindings/interface.h"
using std::string;
using std::vector;
using testing::Test;
namespace chromeos_dbus_bindings {
namespace {
const char kMethod0Name[] = "Kaneda";
const char kMethod0Return[] = "s";
const char kMethod0Argument0[] = "s";
const char kMethod0ArgumentName0[] = "iwata";
const char kMethod0Argument1[] = "ao";
const char kMethod0ArgumentName1[] = "clarke";
const char kMethod1Name[] = "Tetsuo";
const char kMethod1Argument1[] = "i";
const char kMethod1Return[] = "x";
const char kMethod2Name[] = "Kei";
const char kMethod3Name[] = "Kiyoko";
const char kMethod3Return0[] = "x";
const char kMethod3Return1[] = "s";
const char kInterfaceName[] = "org.chromium.TestInterface";
const char kExpectedContent[] = R"literal_string(
#include <string>
#include <vector>
#include <base/macros.h>
#include <dbus/object_path.h>
#include <chromeos/any.h>
#include <chromeos/dbus/dbus_object.h>
#include <chromeos/dbus/exported_object_manager.h>
#include <chromeos/variant_dictionary.h>
namespace org {
namespace chromium {
class TestInterfaceAdaptor {
public:
class MethodInterface {
public:
virtual std::string Kaneda(
chromeos::ErrorPtr* /* error */,
const std::string& /* iwata */,
const std::vector<dbus::ObjectPath>& /* clarke */) = 0;
virtual int64_t Tetsuo(
chromeos::ErrorPtr* /* error */,
int32_t) = 0;
virtual void Kei(
chromeos::ErrorPtr* /* error */) = 0;
};
TestInterfaceAdaptor(
chromeos::dbus_utils::ExportedObjectManager* object_manager,
const std::string& object_path,
MethodInterface* interface) // Owned by caller.
: interface_(interface),
dbus_object_(
object_manager,
object_manager->GetBus(),
dbus::ObjectPath(object_path)),
dbus_interface_(
dbus_object_.AddOrGetInterface("org.chromium.TestInterface")) {
dbus_interface_->AddMethodHandler(
"Kaneda",
base::Unretained(interface_),
&MethodInterface::Kaneda);
dbus_interface_->AddMethodHandler(
"Tetsuo",
base::Unretained(interface_),
&MethodInterface::Tetsuo);
dbus_interface_->AddMethodHandler(
"Kei",
base::Unretained(interface_),
&MethodInterface::Kei);
dbus_object_.RegisterAsync(base::Bind(
&TestInterfaceAdaptor::OnRegisterComplete, base::Unretained(this)));
}
virtual ~TestInterfaceAdaptor() = default;
virtual void OnRegisterComplete(bool success) {}
protected:
chromeos::dbus_utils::DBusInterface* dbus_interface() {
return dbus_interface_;
}
private:
MethodInterface* interface_; // Owned by caller.
chromeos::dbus_utils::DBusObject dbus_object_;
// Owned by |dbus_object_|.
chromeos::dbus_utils::DBusInterface* dbus_interface_;
DISALLOW_COPY_AND_ASSIGN(TestInterfaceAdaptor);
};
} // namespace chromium
} // namespace org
)literal_string";
} // namespace
class AdaptorGeneratorTest : public Test {
public:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
}
protected:
base::FilePath CreateInputFile(const string& contents) {
base::FilePath path;
EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &path));
EXPECT_EQ(contents.size(),
base::WriteFile(path, contents.c_str(), contents.size()));
return path;
}
base::ScopedTempDir temp_dir_;
};
TEST_F(AdaptorGeneratorTest, GenerateAdaptors) {
Interface interface;
interface.name = kInterfaceName;
interface.methods.emplace_back(
kMethod0Name,
vector<Interface::Argument>{
{kMethod0ArgumentName0, kMethod0Argument0},
{kMethod0ArgumentName1, kMethod0Argument1}},
vector<Interface::Argument>{{"", kMethod0Return}});
interface.methods.emplace_back(
kMethod1Name,
vector<Interface::Argument>{{"", kMethod1Argument1}},
vector<Interface::Argument>{{"", kMethod1Return}});
interface.methods.emplace_back(kMethod2Name);
// Interface methods with more than one return argument should be ignored.
interface.methods.emplace_back(
kMethod3Name,
vector<Interface::Argument>{},
vector<Interface::Argument>{
{"", kMethod3Return0},
{"", kMethod3Return1}});
base::FilePath output_path = temp_dir_.path().Append("output.h");
EXPECT_TRUE(AdaptorGenerator::GenerateAdaptor(interface, output_path));
string contents;
EXPECT_TRUE(base::ReadFileToString(output_path, &contents));
// The header guards contain the (temporary) filename, so we search for
// the content we need within the string.
EXPECT_NE(string::npos, contents.find(kExpectedContent))
<< "Expected to find the following content...\n"
<< kExpectedContent << "...within content...\n" << contents;
}
} // namespace chromeos_dbus_bindings