1 // Copyright 2004 Google Inc. All Rights Reserved
7 #include "webrtc/libjingle/xmllite/xmlelement.h"
8 #include "talk/xmpp/xmppstanzaparser.h"
9 #include "webrtc/base/common.h"
10 #include "webrtc/base/gunit.h"
13 using buzz::XmlElement;
14 using buzz::XmppStanzaParser;
15 using buzz::XmppStanzaParseHandler;
17 class XmppStanzaParserTestHandler : public XmppStanzaParseHandler {
19 virtual void StartStream(const XmlElement * element) {
20 ss_ << "START" << element->Str();
22 virtual void Stanza(const XmlElement * element) {
23 ss_ << "STANZA" << element->Str();
25 virtual void EndStream() {
28 virtual void XmlError() {
36 std::string StrClear() {
37 std::string result = ss_.str();
43 std::stringstream ss_;
47 TEST(XmppStanzaParserTest, TestTrivial) {
48 XmppStanzaParserTestHandler handler;
49 XmppStanzaParser parser(&handler);
52 fragment = "<trivial/>";
53 parser.Parse(fragment.c_str(), fragment.length(), false);
54 EXPECT_EQ("START<trivial/>END", handler.StrClear());
57 TEST(XmppStanzaParserTest, TestStanzaAtATime) {
58 XmppStanzaParserTestHandler handler;
59 XmppStanzaParser parser(&handler);
62 fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
63 parser.Parse(fragment.c_str(), fragment.length(), false);
64 EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
65 "xmlns:stream=\"str\"/>", handler.StrClear());
67 fragment = "<message type='foo'><body>hello</body></message>";
68 parser.Parse(fragment.c_str(), fragment.length(), false);
69 EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
70 "<c:body>hello</c:body></c:message>", handler.StrClear());
72 fragment = " SOME TEXT TO IGNORE ";
73 parser.Parse(fragment.c_str(), fragment.length(), false);
74 EXPECT_EQ("", handler.StrClear());
76 fragment = "<iq type='set' id='123'><abc xmlns='def'/></iq>";
77 parser.Parse(fragment.c_str(), fragment.length(), false);
78 EXPECT_EQ("STANZA<c:iq type=\"set\" id=\"123\" xmlns:c=\"j:c\">"
79 "<abc xmlns=\"def\"/></c:iq>", handler.StrClear());
81 fragment = "</stream:stream>";
82 parser.Parse(fragment.c_str(), fragment.length(), false);
83 EXPECT_EQ("END", handler.StrClear());
86 TEST(XmppStanzaParserTest, TestFragmentedStanzas) {
87 XmppStanzaParserTestHandler handler;
88 XmppStanzaParser parser(&handler);
91 fragment = "<stream:stream id='abc' xmlns='j:c' xml";
92 parser.Parse(fragment.c_str(), fragment.length(), false);
93 EXPECT_EQ("", handler.StrClear());
95 fragment = "ns:stream='str'><message type='foo'><body>hel";
96 parser.Parse(fragment.c_str(), fragment.length(), false);
97 EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
98 "xmlns:stream=\"str\"/>", handler.StrClear());
100 fragment = "lo</body></message> IGNORE ME <iq type='set' id='123'>"
101 "<abc xmlns='def'/></iq></st";
102 parser.Parse(fragment.c_str(), fragment.length(), false);
103 EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
104 "<c:body>hello</c:body></c:message>STANZA<c:iq type=\"set\" id=\"123\" "
105 "xmlns:c=\"j:c\"><abc xmlns=\"def\"/></c:iq>", handler.StrClear());
107 fragment = "ream:stream>";
108 parser.Parse(fragment.c_str(), fragment.length(), false);
109 EXPECT_EQ("END", handler.StrClear());
112 TEST(XmppStanzaParserTest, TestReset) {
113 XmppStanzaParserTestHandler handler;
114 XmppStanzaParser parser(&handler);
115 std::string fragment;
117 fragment = "<stream:stream id='abc' xmlns='j:c' xml";
118 parser.Parse(fragment.c_str(), fragment.length(), false);
119 EXPECT_EQ("", handler.StrClear());
122 fragment = "<stream:stream id='abc' xmlns='j:c' xml";
123 parser.Parse(fragment.c_str(), fragment.length(), false);
124 EXPECT_EQ("", handler.StrClear());
126 fragment = "ns:stream='str'><message type='foo'><body>hel";
127 parser.Parse(fragment.c_str(), fragment.length(), false);
128 EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
129 "xmlns:stream=\"str\"/>", handler.StrClear());
132 fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
133 parser.Parse(fragment.c_str(), fragment.length(), false);
134 EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
135 "xmlns:stream=\"str\"/>", handler.StrClear());
137 fragment = "<message type='foo'><body>hello</body></message>";
138 parser.Parse(fragment.c_str(), fragment.length(), false);
139 EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
140 "<c:body>hello</c:body></c:message>", handler.StrClear());
143 TEST(XmppStanzaParserTest, TestError) {
144 XmppStanzaParserTestHandler handler;
145 XmppStanzaParser parser(&handler);
146 std::string fragment;
148 fragment = "<-foobar/>";
149 parser.Parse(fragment.c_str(), fragment.length(), false);
150 EXPECT_EQ("ERROR", handler.StrClear());
153 fragment = "<stream:stream/>";
154 parser.Parse(fragment.c_str(), fragment.length(), false);
155 EXPECT_EQ("ERROR", handler.StrClear());
158 fragment = "ns:stream='str'><message type='foo'><body>hel";
159 parser.Parse(fragment.c_str(), fragment.length(), false);
160 EXPECT_EQ("ERROR", handler.StrClear());
163 fragment = "<stream:stream xmlns:stream='st' xmlns='jc'>"
164 "<foo/><bar><st:foobar/></bar>";
165 parser.Parse(fragment.c_str(), fragment.length(), false);
166 EXPECT_EQ("START<stream:stream xmlns:stream=\"st\" xmlns=\"jc\"/>STANZA"
167 "<jc:foo xmlns:jc=\"jc\"/>ERROR", handler.StrClear());