blob: 5d23db57605308e3383351975b100b791b9256b3 [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/xml_interface_parser.h"
#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 testing::Test;
namespace chromeos_dbus_bindings {
namespace {
const char kBadInterfaceFileContents0[] = "This has no resemblance to XML";
const char kBadInterfaceFileContents1[] = "<node>";
const char kGoodInterfaceFileContents[] =
"<node>\n"
" <interface name=\"fi.w1.wpa_supplicant1.Interface\">\n"
" <method name=\"Scan\">\n"
" <arg name=\"args\" type=\"a{sv}\" direction=\"in\"/>\n"
" </method>\n"
" <method name=\"GetBlob\">\n"
" <arg name=\"name\" type=\"s\"/>\n"
" <arg name=\"data\" type=\"ay\" direction=\"out\"/>\n"
" </method>\n"
" <property name=\"Capabilities\" type=\"a{sv}\" access=\"read\"/>\n"
" <signal name=\"BSSRemoved\">\n"
" <arg name=\"BSS\" type=\"o\"/>\n"
" </signal>\n"
" </interface>\n"
"</node>\n";
const char kInterfaceName[] = "fi.w1.wpa_supplicant1.Interface";
const char kScanMethod[] = "Scan";
const char kArgsArgument[] = "args";
const char kArrayStringVariantType[] = "a{sv}";
const char kGetBlobMethod[] = "GetBlob";
const char kNameArgument[] = "name";
const char kDataArgument[] = "data";
const char kStringType[] = "s";
const char kArrayByteType[] = "ay";
const char kBssRemovedSignal[] = "BSSRemoved";
const char kBssArgument[] = "BSS";
const char kObjectType[] = "o";
} // namespace
class XmlInterfaceParserTest : public Test {
public:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
}
protected:
bool ParseXmlContents(const string& contents) {
base::FilePath path = temp_dir_.path().Append("interface.xml");
EXPECT_TRUE(base::WriteFile(path, contents.c_str(), contents.size()));
return parser_.ParseXmlInterfaceFile(path);
}
base::ScopedTempDir temp_dir_;
XmlInterfaceParser parser_;
};
TEST_F(XmlInterfaceParserTest, BadInputFile) {
EXPECT_FALSE(parser_.ParseXmlInterfaceFile(base::FilePath()));
EXPECT_FALSE(ParseXmlContents(kBadInterfaceFileContents0));
EXPECT_FALSE(ParseXmlContents(kBadInterfaceFileContents1));
}
TEST_F(XmlInterfaceParserTest, GoodInputFile) {
EXPECT_TRUE(ParseXmlContents(kGoodInterfaceFileContents));
const Interface& interface = parser_.interface();
EXPECT_EQ(kInterfaceName, interface.name);
ASSERT_EQ(2, interface.methods.size());
ASSERT_EQ(1, interface.signals.size());
// <method name="Scan">
EXPECT_EQ(kScanMethod, interface.methods[0].name);
ASSERT_EQ(1, interface.methods[0].input_arguments.size());
// <arg name="args" type="a{sv}" direction="in"/>
EXPECT_EQ(kArgsArgument, interface.methods[0].input_arguments[0].name);
EXPECT_EQ(kArrayStringVariantType,
interface.methods[0].input_arguments[0].type);
EXPECT_EQ(0, interface.methods[0].output_arguments.size());
// <method name="GetBlob">
EXPECT_EQ(kGetBlobMethod, interface.methods[1].name);
EXPECT_EQ(1, interface.methods[1].input_arguments.size());
EXPECT_EQ(1, interface.methods[1].output_arguments.size());
// <arg name="name" type="s"/> (direciton="in" is implicit)
EXPECT_EQ(kNameArgument, interface.methods[1].input_arguments[0].name);
EXPECT_EQ(kStringType, interface.methods[1].input_arguments[0].type);
// <arg name="data" type="ay" direction="out"/>
EXPECT_EQ(kDataArgument, interface.methods[1].output_arguments[0].name);
EXPECT_EQ(kArrayByteType, interface.methods[1].output_arguments[0].type);
// <signal name="BSSRemoved">
EXPECT_EQ(kBssRemovedSignal, interface.signals[0].name);
EXPECT_EQ(1, interface.signals[0].arguments.size());
// <arg name="BSS" type="o"/>
EXPECT_EQ(kBssArgument, interface.signals[0].arguments[0].name);
EXPECT_EQ(kObjectType, interface.signals[0].arguments[0].type);
}
} // namespace chromeos_dbus_bindings