| OLD | NEW | 
|---|
|  | (Empty) | 
| 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 } |  | 
| OLD | NEW | 
|---|