Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 1 | // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "chromeos-dbus-bindings/xml_interface_parser.h" |
| 6 | |
| 7 | #include <base/file_util.h> |
| 8 | #include <base/files/file_path.h> |
| 9 | #include <base/files/scoped_temp_dir.h> |
| 10 | #include <gtest/gtest.h> |
| 11 | |
| 12 | #include "chromeos-dbus-bindings/interface.h" |
| 13 | |
| 14 | using std::string; |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 15 | using std::vector; |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 16 | using testing::Test; |
| 17 | |
| 18 | namespace chromeos_dbus_bindings { |
| 19 | |
| 20 | namespace { |
| 21 | |
| 22 | const char kBadInterfaceFileContents0[] = "This has no resemblance to XML"; |
| 23 | const char kBadInterfaceFileContents1[] = "<node>"; |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 24 | const char kGoodInterfaceFileContents[] = R"literal_string( |
| 25 | <node> |
| 26 | <interface name="fi.w1.wpa_supplicant1.Interface"> |
| 27 | <method name="Scan"> |
| 28 | <arg name="args" type="a{sv}" direction="in"/> |
| 29 | <annotation name="org.chromium.DBus.Method.Kind" value="async"/> |
| 30 | </method> |
| 31 | <method name="GetBlob"> |
| 32 | <arg name="name" type="s"/> |
| 33 | <arg name="data" type="ay" direction="out"/> |
| 34 | <annotation name="org.chromium.DBus.Method.Const" value="true"/> |
| 35 | </method> |
| 36 | <property name="Capabilities" type="a{sv}" access="read"/> |
| 37 | <signal name="BSSRemoved"> |
| 38 | <arg name="BSS" type="o"/> |
| 39 | </signal> |
| 40 | </interface> |
| 41 | </node> |
| 42 | )literal_string"; |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 43 | const char kInterfaceName[] = "fi.w1.wpa_supplicant1.Interface"; |
| 44 | const char kScanMethod[] = "Scan"; |
| 45 | const char kArgsArgument[] = "args"; |
| 46 | const char kArrayStringVariantType[] = "a{sv}"; |
| 47 | const char kGetBlobMethod[] = "GetBlob"; |
| 48 | const char kNameArgument[] = "name"; |
| 49 | const char kDataArgument[] = "data"; |
| 50 | const char kStringType[] = "s"; |
| 51 | const char kArrayByteType[] = "ay"; |
| 52 | const char kBssRemovedSignal[] = "BSSRemoved"; |
| 53 | const char kBssArgument[] = "BSS"; |
| 54 | const char kObjectType[] = "o"; |
Peter Qiu | dd88575 | 2014-11-02 16:00:46 -0800 | [diff] [blame] | 55 | const char kCapabilitiesProperty[] = "Capabilities"; |
| 56 | const char kReadAccess[] = "read"; |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 57 | } // namespace |
| 58 | |
| 59 | class XmlInterfaceParserTest : public Test { |
| 60 | public: |
| 61 | void SetUp() override { |
| 62 | ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 63 | } |
| 64 | |
| 65 | protected: |
| 66 | bool ParseXmlContents(const string& contents) { |
| 67 | base::FilePath path = temp_dir_.path().Append("interface.xml"); |
| 68 | EXPECT_TRUE(base::WriteFile(path, contents.c_str(), contents.size())); |
| 69 | return parser_.ParseXmlInterfaceFile(path); |
| 70 | } |
| 71 | |
| 72 | base::ScopedTempDir temp_dir_; |
| 73 | XmlInterfaceParser parser_; |
| 74 | }; |
| 75 | |
| 76 | TEST_F(XmlInterfaceParserTest, BadInputFile) { |
| 77 | EXPECT_FALSE(parser_.ParseXmlInterfaceFile(base::FilePath())); |
| 78 | EXPECT_FALSE(ParseXmlContents(kBadInterfaceFileContents0)); |
| 79 | EXPECT_FALSE(ParseXmlContents(kBadInterfaceFileContents1)); |
| 80 | } |
| 81 | |
| 82 | TEST_F(XmlInterfaceParserTest, GoodInputFile) { |
| 83 | EXPECT_TRUE(ParseXmlContents(kGoodInterfaceFileContents)); |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 84 | const vector<Interface>& interfaces = parser_.interfaces(); |
| 85 | ASSERT_EQ(1, interfaces.size()); |
| 86 | const Interface& interface = interfaces.back(); |
| 87 | |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 88 | EXPECT_EQ(kInterfaceName, interface.name); |
| 89 | ASSERT_EQ(2, interface.methods.size()); |
| 90 | ASSERT_EQ(1, interface.signals.size()); |
| 91 | |
| 92 | // <method name="Scan"> |
| 93 | EXPECT_EQ(kScanMethod, interface.methods[0].name); |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 94 | EXPECT_EQ(Interface::Method::Kind::kAsync, interface.methods[0].kind); |
| 95 | EXPECT_FALSE(interface.methods[0].is_const); |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 96 | ASSERT_EQ(1, interface.methods[0].input_arguments.size()); |
| 97 | |
| 98 | // <arg name="args" type="a{sv}" direction="in"/> |
| 99 | EXPECT_EQ(kArgsArgument, interface.methods[0].input_arguments[0].name); |
| 100 | EXPECT_EQ(kArrayStringVariantType, |
| 101 | interface.methods[0].input_arguments[0].type); |
| 102 | EXPECT_EQ(0, interface.methods[0].output_arguments.size()); |
| 103 | |
| 104 | // <method name="GetBlob"> |
| 105 | EXPECT_EQ(kGetBlobMethod, interface.methods[1].name); |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 106 | EXPECT_EQ(Interface::Method::Kind::kNormal, interface.methods[1].kind); |
| 107 | EXPECT_TRUE(interface.methods[1].is_const); |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 108 | EXPECT_EQ(1, interface.methods[1].input_arguments.size()); |
| 109 | EXPECT_EQ(1, interface.methods[1].output_arguments.size()); |
| 110 | |
Alex Vakulenko | fafef13 | 2014-11-03 14:52:09 -0800 | [diff] [blame^] | 111 | // <arg name="name" type="s"/> (direction="in" is implicit) |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 112 | EXPECT_EQ(kNameArgument, interface.methods[1].input_arguments[0].name); |
| 113 | EXPECT_EQ(kStringType, interface.methods[1].input_arguments[0].type); |
| 114 | |
| 115 | // <arg name="data" type="ay" direction="out"/> |
| 116 | EXPECT_EQ(kDataArgument, interface.methods[1].output_arguments[0].name); |
| 117 | EXPECT_EQ(kArrayByteType, interface.methods[1].output_arguments[0].type); |
| 118 | |
| 119 | // <signal name="BSSRemoved"> |
| 120 | EXPECT_EQ(kBssRemovedSignal, interface.signals[0].name); |
| 121 | EXPECT_EQ(1, interface.signals[0].arguments.size()); |
| 122 | |
| 123 | // <arg name="BSS" type="o"/> |
| 124 | EXPECT_EQ(kBssArgument, interface.signals[0].arguments[0].name); |
| 125 | EXPECT_EQ(kObjectType, interface.signals[0].arguments[0].type); |
Peter Qiu | dd88575 | 2014-11-02 16:00:46 -0800 | [diff] [blame] | 126 | |
| 127 | // <property name="Capabilities" type="s" access="read"/> |
| 128 | EXPECT_EQ(kCapabilitiesProperty, interface.properties[0].name); |
| 129 | EXPECT_EQ(kArrayStringVariantType, interface.properties[0].type); |
| 130 | EXPECT_EQ(kReadAccess, interface.properties[0].access); |
Paul Stewart | 2b1c612 | 2014-08-19 21:18:12 -0700 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | } // namespace chromeos_dbus_bindings |