Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / libjingle / xmpp / xmppstanzaparser_unittest.cc
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 #include <iostream>
12 #include <sstream>
13 #include <string>
14 #include "webrtc/libjingle/xmllite/xmlelement.h"
15 #include "webrtc/libjingle/xmpp/xmppstanzaparser.h"
16 #include "webrtc/base/common.h"
17 #include "webrtc/base/gunit.h"
18
19 using buzz::QName;
20 using buzz::XmlElement;
21 using buzz::XmppStanzaParser;
22 using buzz::XmppStanzaParseHandler;
23
24 class XmppStanzaParserTestHandler : public XmppStanzaParseHandler {
25  public:
26   virtual void StartStream(const XmlElement * element) {
27     ss_ << "START" << element->Str();
28   }
29   virtual void Stanza(const XmlElement * element) {
30     ss_ << "STANZA" << element->Str();
31   }
32   virtual void EndStream() {
33     ss_ << "END";
34   }
35   virtual void XmlError() {
36     ss_ << "ERROR";
37   }
38
39   std::string Str() {
40     return ss_.str();
41   }
42
43   std::string StrClear() {
44     std::string result = ss_.str();
45     ss_.str("");
46     return result;
47   }
48
49  private:
50   std::stringstream ss_;
51 };
52
53
54 TEST(XmppStanzaParserTest, TestTrivial) {
55   XmppStanzaParserTestHandler handler;
56   XmppStanzaParser parser(&handler);
57   std::string fragment;
58
59   fragment = "<trivial/>";
60   parser.Parse(fragment.c_str(), fragment.length(), false);
61   EXPECT_EQ("START<trivial/>END", handler.StrClear());
62 }
63
64 TEST(XmppStanzaParserTest, TestStanzaAtATime) {
65   XmppStanzaParserTestHandler handler;
66   XmppStanzaParser parser(&handler);
67   std::string fragment;
68
69   fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
70   parser.Parse(fragment.c_str(), fragment.length(), false);
71   EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
72       "xmlns:stream=\"str\"/>", handler.StrClear());
73
74   fragment = "<message type='foo'><body>hello</body></message>";
75   parser.Parse(fragment.c_str(), fragment.length(), false);
76   EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
77       "<c:body>hello</c:body></c:message>", handler.StrClear());
78
79   fragment = " SOME TEXT TO IGNORE ";
80   parser.Parse(fragment.c_str(), fragment.length(), false);
81   EXPECT_EQ("", handler.StrClear());
82
83   fragment = "<iq type='set' id='123'><abc xmlns='def'/></iq>";
84   parser.Parse(fragment.c_str(), fragment.length(), false);
85   EXPECT_EQ("STANZA<c:iq type=\"set\" id=\"123\" xmlns:c=\"j:c\">"
86       "<abc xmlns=\"def\"/></c:iq>", handler.StrClear());
87
88   fragment = "</stream:stream>";
89   parser.Parse(fragment.c_str(), fragment.length(), false);
90   EXPECT_EQ("END", handler.StrClear());
91 }
92
93 TEST(XmppStanzaParserTest, TestFragmentedStanzas) {
94   XmppStanzaParserTestHandler handler;
95   XmppStanzaParser parser(&handler);
96   std::string fragment;
97
98   fragment = "<stream:stream id='abc' xmlns='j:c' xml";
99   parser.Parse(fragment.c_str(), fragment.length(), false);
100   EXPECT_EQ("", handler.StrClear());
101
102   fragment = "ns:stream='str'><message type='foo'><body>hel";
103   parser.Parse(fragment.c_str(), fragment.length(), false);
104   EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
105       "xmlns:stream=\"str\"/>", handler.StrClear());
106
107   fragment = "lo</body></message> IGNORE ME <iq type='set' id='123'>"
108       "<abc xmlns='def'/></iq></st";
109   parser.Parse(fragment.c_str(), fragment.length(), false);
110   EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
111       "<c:body>hello</c:body></c:message>STANZA<c:iq type=\"set\" id=\"123\" "
112       "xmlns:c=\"j:c\"><abc xmlns=\"def\"/></c:iq>", handler.StrClear());
113
114   fragment = "ream:stream>";
115   parser.Parse(fragment.c_str(), fragment.length(), false);
116   EXPECT_EQ("END", handler.StrClear());
117 }
118
119 TEST(XmppStanzaParserTest, TestReset) {
120   XmppStanzaParserTestHandler handler;
121   XmppStanzaParser parser(&handler);
122   std::string fragment;
123
124   fragment = "<stream:stream id='abc' xmlns='j:c' xml";
125   parser.Parse(fragment.c_str(), fragment.length(), false);
126   EXPECT_EQ("", handler.StrClear());
127
128   parser.Reset();
129   fragment = "<stream:stream id='abc' xmlns='j:c' xml";
130   parser.Parse(fragment.c_str(), fragment.length(), false);
131   EXPECT_EQ("", handler.StrClear());
132
133   fragment = "ns:stream='str'><message type='foo'><body>hel";
134   parser.Parse(fragment.c_str(), fragment.length(), false);
135   EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
136       "xmlns:stream=\"str\"/>", handler.StrClear());
137   parser.Reset();
138
139   fragment = "<stream:stream id='abc' xmlns='j:c' xmlns:stream='str'>";
140   parser.Parse(fragment.c_str(), fragment.length(), false);
141   EXPECT_EQ("START<stream:stream id=\"abc\" xmlns=\"j:c\" "
142       "xmlns:stream=\"str\"/>", handler.StrClear());
143
144   fragment = "<message type='foo'><body>hello</body></message>";
145   parser.Parse(fragment.c_str(), fragment.length(), false);
146   EXPECT_EQ("STANZA<c:message type=\"foo\" xmlns:c=\"j:c\">"
147       "<c:body>hello</c:body></c:message>", handler.StrClear());
148 }
149
150 TEST(XmppStanzaParserTest, TestError) {
151   XmppStanzaParserTestHandler handler;
152   XmppStanzaParser parser(&handler);
153   std::string fragment;
154
155   fragment = "<-foobar/>";
156   parser.Parse(fragment.c_str(), fragment.length(), false);
157   EXPECT_EQ("ERROR", handler.StrClear());
158
159   parser.Reset();
160   fragment = "<stream:stream/>";
161   parser.Parse(fragment.c_str(), fragment.length(), false);
162   EXPECT_EQ("ERROR", handler.StrClear());
163   parser.Reset();
164
165   fragment = "ns:stream='str'><message type='foo'><body>hel";
166   parser.Parse(fragment.c_str(), fragment.length(), false);
167   EXPECT_EQ("ERROR", handler.StrClear());
168   parser.Reset();
169
170   fragment = "<stream:stream xmlns:stream='st' xmlns='jc'>"
171       "<foo/><bar><st:foobar/></bar>";
172   parser.Parse(fragment.c_str(), fragment.length(), false);
173   EXPECT_EQ("START<stream:stream xmlns:stream=\"st\" xmlns=\"jc\"/>STANZA"
174       "<jc:foo xmlns:jc=\"jc\"/>ERROR", handler.StrClear());
175 }