// 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
