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