// 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/files/file_path.h>
#include <base/files/file_util.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 kBadInterfaceFileContents0[] = "This has no resemblance to XML";
const char kBadInterfaceFileContents1[] = "<node>";
const char kGoodInterfaceFileContents[] = R"literal_string(
<node name="/org/chromium/Test">
  <interface name="fi.w1.wpa_supplicant1.Interface">
    <method name="Scan">
      <arg name="args" type="a{sv}" direction="in"/>
      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
      <annotation name="org.chromium.DBus.Method.IncludeDBusMessage"
                  value="true"/>
    </method>
    <method name="GetBlob">
      <arg name="name" type="s"/>
      <arg name="data" type="ay" direction="out"/>
      <annotation name="org.chromium.DBus.Method.Const" value="true"/>
    </method>
    <method name="PassMeProtos">
      <arg name="request" type="ay" direction="in">
        <annotation
          name="org.chromium.DBus.Argument.ProtobufClass"
          value="PassMeProtosRequest" />
      </arg>
      <arg name="reply" type="ay" direction="out">
        <annotation
          name="org.chromium.DBus.Argument.ProtobufClass"
          value="PassMeProtosReply" />
      </arg>
      <annotation name="org.chromium.DBus.Method.Kind" value="async"/>
    </method>
    <property name="Capabilities" type="a{sv}" access="read"/>
    <signal name="BSSRemoved">
      <arg name="BSS" type="o"/>
      <arg name="BSSDetail" type="ay">
        <annotation
          name="org.chromium.DBus.Argument.ProtobufClass"
          value="YetAnotherProto" />
      </arg>
    </signal>
  </interface>
  <interface name="DummyInterface" />
  <node name="/"/>
  <node/>
</node>
)literal_string";
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 kPassMeProtosMethod[] = "PassMeProtos";
const char kRequestArgument[] = "request";
const char kRequestArgumentProto[] = "PassMeProtosRequest";
const char kReplyArgument[] = "reply";
const char kReplyArgumentProto[] = "PassMeProtosReply";
const char kBssRemovedSignal[] = "BSSRemoved";
const char kBssArgument[] = "BSS";
const char kBssDetailArgument[] = "BSSDetail";
const char kBssDetailArgumentProto[] = "YetAnotherProto";
const char kObjectType[] = "o";
const char kCapabilitiesProperty[] = "Capabilities";
const char kReadAccess[] = "read";
}  // namespace

class XmlInterfaceParserTest : public Test {
 protected:
  XmlInterfaceParser parser_;
};

TEST_F(XmlInterfaceParserTest, BadInputFile) {
  EXPECT_FALSE(parser_.ParseXmlInterfaceFile(kBadInterfaceFileContents0, {}));
  EXPECT_FALSE(parser_.ParseXmlInterfaceFile(kBadInterfaceFileContents1, {}));
}

TEST_F(XmlInterfaceParserTest, GoodInputFile) {
  EXPECT_TRUE(parser_.ParseXmlInterfaceFile(kGoodInterfaceFileContents,
                                            {"DummyInterface"}));
  const vector<Interface>& interfaces = parser_.interfaces();
  ASSERT_EQ(1u, interfaces.size());
  const Interface& interface = interfaces.back();

  EXPECT_EQ(kInterfaceName, interface.name);
  EXPECT_EQ("/org/chromium/Test", interface.path);
  ASSERT_EQ(3u, interface.methods.size());
  ASSERT_EQ(1u, interface.signals.size());

  // <method name="Scan">
  EXPECT_EQ(kScanMethod, interface.methods[0].name);
  EXPECT_EQ(Interface::Method::Kind::kAsync, interface.methods[0].kind);
  EXPECT_FALSE(interface.methods[0].is_const);
  EXPECT_TRUE(interface.methods[0].include_dbus_message);
  ASSERT_EQ(1u, 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(0u, interface.methods[0].output_arguments.size());

  // <method name="GetBlob">
  EXPECT_EQ(kGetBlobMethod, interface.methods[1].name);
  EXPECT_EQ(Interface::Method::Kind::kNormal, interface.methods[1].kind);
  EXPECT_TRUE(interface.methods[1].is_const);
  EXPECT_FALSE(interface.methods[1].include_dbus_message);
  EXPECT_EQ(1u, interface.methods[1].input_arguments.size());
  EXPECT_EQ(1u, interface.methods[1].output_arguments.size());

  // <arg name="name" type="s"/>  (direction="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);

  // <method name="PassMeProtos">
  EXPECT_EQ(kPassMeProtosMethod, interface.methods[2].name);
  EXPECT_EQ(Interface::Method::Kind::kAsync, interface.methods[2].kind);
  EXPECT_FALSE(interface.methods[2].is_const);
  EXPECT_FALSE(interface.methods[2].include_dbus_message);
  EXPECT_EQ(1u, interface.methods[2].input_arguments.size());
  EXPECT_EQ(1u, interface.methods[2].output_arguments.size());

  // <arg name="request" type="ay" direction="in">
  // <annotation
  //    name="org.chromium.DBus.Argument.ProtobufClass"
  //    value="PassMeProtosRequest" />
  EXPECT_EQ(kRequestArgument, interface.methods[2].input_arguments[0].name);
  EXPECT_EQ(string(kProtobufType) + string(kRequestArgumentProto),
            interface.methods[2].input_arguments[0].type);

  // <arg name="reply" type="ay" direction="out">
  // <annotation
  //    name="org.chromium.DBus.Argument.ProtobufClass"
  //    value="PassMeProtosReply" />
  EXPECT_EQ(kReplyArgument, interface.methods[2].output_arguments[0].name);
  EXPECT_EQ(string(kProtobufType) + string(kReplyArgumentProto),
            interface.methods[2].output_arguments[0].type);

  // <signal name="BSSRemoved">
  EXPECT_EQ(kBssRemovedSignal, interface.signals[0].name);
  EXPECT_EQ(2u, 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);

  // <arg name="BSSDetail" type="ay">
  EXPECT_EQ(kBssDetailArgument, interface.signals[0].arguments[1].name);
  EXPECT_EQ(string(kProtobufType) + string(kBssDetailArgumentProto),
            interface.signals[0].arguments[1].type);

  // <property name="Capabilities" type="s" access="read"/>
  EXPECT_EQ(kCapabilitiesProperty, interface.properties[0].name);
  EXPECT_EQ(kArrayStringVariantType, interface.properties[0].type);
  EXPECT_EQ(kReadAccess, interface.properties[0].access);
}

}  // namespace chromeos_dbus_bindings
