15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Copyright 2004 Google Inc. All Rights Reserved
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sstream>
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <iostream>
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h"
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlelement.h"
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppstanzaparser.h"
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QName;
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmlElement;
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppStanzaParser;
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppStanzaParseHandler;
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass XmppStanzaParserTestHandler : public XmppStanzaParseHandler {
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void StartStream(const XmlElement * element) {
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss_ << "START" << element->Str();
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void Stanza(const XmlElement * element) {
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss_ << "STANZA" << element->Str();
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void EndStream() {
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss_ << "END";
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void XmlError() {
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss_ << "ERROR";
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string Str() {
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ss_.str();
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string StrClear() {
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::string result = ss_.str();
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ss_.str("");
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return result;
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::stringstream ss_;
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(XmppStanzaParserTest, TestTrivial) {
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParserTestHandler handler;
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParser parser(&handler);
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string fragment;
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<trivial/>";
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<trivial/>END", handler.StrClear());
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(XmppStanzaParserTest, TestStanzaAtATime) {
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParserTestHandler handler;
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParser parser(&handler);
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string fragment;
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "xmlns:stream=\"str\"/>", handler.StrClear());
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<message type='foo'><body>hello</body></message>";
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<c:body>hello</c:body></c:message>", handler.StrClear());
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = " SOME TEXT TO IGNORE ";
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("", handler.StrClear());
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<iq type='set' id='123'><abc xmlns='def'/></iq>";
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("STANZA<c:iq type=\"set\" id=\"123\" xmlns:c=\"j:c\">"
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<abc xmlns=\"def\"/></c:iq>", handler.StrClear());
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "</stream:stream>";
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("END", handler.StrClear());
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(XmppStanzaParserTest, TestFragmentedStanzas) {
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParserTestHandler handler;
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParser parser(&handler);
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string fragment;
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("", handler.StrClear());
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "ns:stream='str'><message type='foo'><body>hel";
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "xmlns:stream=\"str\"/>", handler.StrClear());
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "lo</body></message> IGNORE ME <iq type='set' id='123'>"
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<abc xmlns='def'/></iq></st";
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<c:body>hello</c:body></c:message>STANZA<c:iq type=\"set\" id=\"123\" "
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "xmlns:c=\"j:c\"><abc xmlns=\"def\"/></c:iq>", handler.StrClear());
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "ream:stream>";
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("END", handler.StrClear());
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(XmppStanzaParserTest, TestReset) {
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParserTestHandler handler;
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParser parser(&handler);
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string fragment;
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("", handler.StrClear());
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Reset();
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream id='abc' xmlns='j:c' xml";
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("", handler.StrClear());
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "ns:stream='str'><message type='foo'><body>hel";
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "xmlns:stream=\"str\"/>", handler.StrClear());
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Reset();
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "xmlns:stream=\"str\"/>", handler.StrClear());
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<message type='foo'><body>hello</body></message>";
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<c:body>hello</c:body></c:message>", handler.StrClear());
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(XmppStanzaParserTest, TestError) {
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParserTestHandler handler;
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  XmppStanzaParser parser(&handler);
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string fragment;
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<-foobar/>";
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("ERROR", handler.StrClear());
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Reset();
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream/>";
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("ERROR", handler.StrClear());
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Reset();
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "ns:stream='str'><message type='foo'><body>hel";
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("ERROR", handler.StrClear());
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Reset();
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  fragment = "<stream:stream xmlns:stream='st' xmlns='jc'>"
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<foo/><bar><st:foobar/></bar>";
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  parser.Parse(fragment.c_str(), fragment.length(), false);
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("START<stream:stream xmlns:stream=\"st\" xmlns=\"jc\"/>STANZA"
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<jc:foo xmlns:jc=\"jc\"/>ERROR", handler.StrClear());
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
169