// Copyright 2004 Google Inc. All Rights Reserved


#include <string>
#include <sstream>
#include <iostream>
#include "talk/base/common.h"
#include "talk/base/gunit.h"
#include "talk/xmllite/xmlelement.h"
#include "talk/xmpp/xmppstanzaparser.h"

using buzz::QName;
using buzz::XmlElement;
using buzz::XmppStanzaParser;
using buzz::XmppStanzaParseHandler;

class XmppStanzaParserTestHandler : public XmppStanzaParseHandler {
 public:
  virtual void StartStream(const XmlElement * element) {
    ss_ << "START" << element->Str();
  }
  virtual void Stanza(const XmlElement * element) {
    ss_ << "STANZA" << element->Str();
  }
  virtual void EndStream() {
    ss_ << "END";
  }
  virtual void XmlError() {
    ss_ << "ERROR";
  }

  std::string Str() {
    return ss_.str();
  }

  std::string StrClear() {
    std::string result = ss_.str();
    ss_.str("");
    return result;
  }

 private:
  std::stringstream ss_;
};


TEST(XmppStanzaParserTest, TestTrivial) {
  XmppStanzaParserTestHandler handler;
  XmppStanzaParser parser(&handler);
  std::string fragment;

  fragment = "<trivial/>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<trivial/>END", handler.StrClear());
}

TEST(XmppStanzaParserTest, TestStanzaAtATime) {
  XmppStanzaParserTestHandler handler;
  XmppStanzaParser parser(&handler);
  std::string fragment;

  fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
      "xmlns:stream=\"str\"/>", handler.StrClear());

  fragment = "<message type='foo'><body>hello</body></message>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
      "<c:body>hello</c:body></c:message>", handler.StrClear());

  fragment = " SOME TEXT TO IGNORE ";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("", handler.StrClear());

  fragment = "<iq type='set' id='123'><abc xmlns='def'/></iq>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("STANZA<c:iq type=\"set\" id=\"123\" xmlns:c=\"j:c\">"
      "<abc xmlns=\"def\"/></c:iq>", handler.StrClear());

  fragment = "</stream:stream>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("END", handler.StrClear());
}

TEST(XmppStanzaParserTest, TestFragmentedStanzas) {
  XmppStanzaParserTestHandler handler;
  XmppStanzaParser parser(&handler);
  std::string fragment;

  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("", handler.StrClear());

  fragment = "ns:stream='str'><message type='foo'><body>hel";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
      "xmlns:stream=\"str\"/>", handler.StrClear());

  fragment = "lo</body></message> IGNORE ME <iq type='set' id='123'>"
      "<abc xmlns='def'/></iq></st";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
      "<c:body>hello</c:body></c:message>STANZA<c:iq type=\"set\" id=\"123\" "
      "xmlns:c=\"j:c\"><abc xmlns=\"def\"/></c:iq>", handler.StrClear());

  fragment = "ream:stream>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("END", handler.StrClear());
}

TEST(XmppStanzaParserTest, TestReset) {
  XmppStanzaParserTestHandler handler;
  XmppStanzaParser parser(&handler);
  std::string fragment;

  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("", handler.StrClear());

  parser.Reset();
  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("", handler.StrClear());

  fragment = "ns:stream='str'><message type='foo'><body>hel";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
      "xmlns:stream=\"str\"/>", handler.StrClear());
  parser.Reset();

  fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
      "xmlns:stream=\"str\"/>", handler.StrClear());

  fragment = "<message type='foo'><body>hello</body></message>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
      "<c:body>hello</c:body></c:message>", handler.StrClear());
}

TEST(XmppStanzaParserTest, TestError) {
  XmppStanzaParserTestHandler handler;
  XmppStanzaParser parser(&handler);
  std::string fragment;

  fragment = "<-foobar/>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("ERROR", handler.StrClear());

  parser.Reset();
  fragment = "<stream:stream/>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("ERROR", handler.StrClear());
  parser.Reset();

  fragment = "ns:stream='str'><message type='foo'><body>hel";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("ERROR", handler.StrClear());
  parser.Reset();

  fragment = "<stream:stream xmlns:stream='st' xmlns='jc'>"
      "<foo/><bar><st:foobar/></bar>";
  parser.Parse(fragment.c_str(), fragment.length(), false);
  EXPECT_EQ("START<stream:stream xmlns:stream=\"st\" xmlns=\"jc\"/>STANZA"
      "<jc:foo xmlns:jc=\"jc\"/>ERROR", handler.StrClear());
}
