OLD | NEW |
(Empty) | |
| 1 // Copyright 2004 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <iostream> |
| 6 #include <sstream> |
| 7 #include <string> |
| 8 #include "third_party/libjingle_xmpp/xmllite/qname.h" |
| 9 #include "third_party/libjingle_xmpp/xmllite/xmlparser.h" |
| 10 #include "webrtc/base/common.h" |
| 11 #include "webrtc/base/gunit.h" |
| 12 |
| 13 using buzz::QName; |
| 14 using buzz::XmlParser; |
| 15 using buzz::XmlParseContext; |
| 16 using buzz::XmlParseHandler; |
| 17 |
| 18 class XmlParserTestHandler : public XmlParseHandler { |
| 19 public: |
| 20 virtual void StartElement(XmlParseContext * pctx, |
| 21 const char * name, const char ** atts) { |
| 22 ss_ << "START (" << pctx->ResolveQName(name, false).Merged(); |
| 23 while (*atts) { |
| 24 ss_ << ", " << pctx->ResolveQName(*atts, true).Merged() |
| 25 << "='" << *(atts+1) << "'"; |
| 26 atts += 2; |
| 27 } |
| 28 ss_ << ") "; |
| 29 } |
| 30 virtual void EndElement(XmlParseContext * pctx, const char * name) { |
| 31 RTC_UNUSED(pctx); |
| 32 RTC_UNUSED(name); |
| 33 ss_ << "END "; |
| 34 } |
| 35 virtual void CharacterData(XmlParseContext * pctx, |
| 36 const char * text, int len) { |
| 37 RTC_UNUSED(pctx); |
| 38 ss_ << "TEXT (" << std::string(text, len) << ") "; |
| 39 } |
| 40 virtual void Error(XmlParseContext * pctx, XML_Error code) { |
| 41 RTC_UNUSED(pctx); |
| 42 ss_ << "ERROR (" << static_cast<int>(code) << ") "; |
| 43 } |
| 44 virtual ~XmlParserTestHandler() { |
| 45 } |
| 46 |
| 47 std::string Str() { |
| 48 return ss_.str(); |
| 49 } |
| 50 |
| 51 std::string StrClear() { |
| 52 std::string result = ss_.str(); |
| 53 ss_.str(""); |
| 54 return result; |
| 55 } |
| 56 |
| 57 private: |
| 58 std::stringstream ss_; |
| 59 }; |
| 60 |
| 61 |
| 62 TEST(XmlParserTest, TestTrivial) { |
| 63 XmlParserTestHandler handler; |
| 64 XmlParser::ParseXml(&handler, "<testing/>"); |
| 65 EXPECT_EQ("START (testing) END ", handler.Str()); |
| 66 } |
| 67 |
| 68 TEST(XmlParserTest, TestAttributes) { |
| 69 { |
| 70 XmlParserTestHandler handler; |
| 71 XmlParser::ParseXml(&handler, "<testing a='b'/>"); |
| 72 EXPECT_EQ("START (testing, a='b') END ", handler.Str()); |
| 73 } |
| 74 { |
| 75 XmlParserTestHandler handler; |
| 76 XmlParser::ParseXml(&handler, "<testing e='' long='some text'/>"); |
| 77 EXPECT_EQ("START (testing, e='', long='some text') END ", handler.Str()); |
| 78 } |
| 79 } |
| 80 |
| 81 TEST(XmlParserTest, TestNesting) { |
| 82 { |
| 83 XmlParserTestHandler handler; |
| 84 XmlParser::ParseXml(&handler, |
| 85 "<top><first/><second><third></third></second></top>"); |
| 86 EXPECT_EQ("START (top) START (first) END START (second) START (third) " |
| 87 "END END END ", handler.Str()); |
| 88 } |
| 89 { |
| 90 XmlParserTestHandler handler; |
| 91 XmlParser::ParseXml(&handler, "<top><fifth><deeper><and><deeper/></and>" |
| 92 "<sibling><leaf/></sibling></deeper></fifth><first/><second>" |
| 93 "<third></third></second></top>"); |
| 94 EXPECT_EQ("START (top) START (fifth) START (deeper) START (and) START " |
| 95 "(deeper) END END START (sibling) START (leaf) END END END " |
| 96 "END START (first) END START (second) START (third) END END END ", |
| 97 handler.Str()); |
| 98 } |
| 99 } |
| 100 |
| 101 TEST(XmlParserTest, TestXmlDecl) { |
| 102 { |
| 103 XmlParserTestHandler handler; |
| 104 XmlParser::ParseXml(&handler, "<?xml version=\"1.0\"?><testing/>"); |
| 105 EXPECT_EQ("START (testing) END ", handler.Str()); |
| 106 } |
| 107 { |
| 108 XmlParserTestHandler handler; |
| 109 XmlParser::ParseXml(&handler, |
| 110 "<?xml version=\"1.0\" encoding=\"utf-8\"?><testing/>"); |
| 111 EXPECT_EQ("START (testing) END ", handler.Str()); |
| 112 } |
| 113 { |
| 114 XmlParserTestHandler handler; |
| 115 XmlParser::ParseXml(&handler, |
| 116 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" |
| 117 "<testing/>"); |
| 118 EXPECT_EQ("START (testing) END ", handler.Str()); |
| 119 } |
| 120 } |
| 121 |
| 122 TEST(XmlParserTest, TestNamespace) { |
| 123 { |
| 124 XmlParserTestHandler handler; |
| 125 XmlParser::ParseXml(&handler, "<top xmlns='my-namespace' a='b'/>"); |
| 126 EXPECT_EQ("START (my-namespace:top, xmlns='my-namespace', a='b') END ", |
| 127 handler.Str()); |
| 128 } |
| 129 { |
| 130 XmlParserTestHandler handler; |
| 131 XmlParser::ParseXml(&handler, "<foo:top xmlns:foo='my-namespace' " |
| 132 "a='b' foo:c='d'/>"); |
| 133 EXPECT_EQ("START (my-namespace:top, " |
| 134 "http://www.w3.org/2000/xmlns/:foo='my-namespace', " |
| 135 "a='b', my-namespace:c='d') END ", handler.Str()); |
| 136 } |
| 137 { |
| 138 XmlParserTestHandler handler; |
| 139 XmlParser::ParseXml(&handler, "<top><nested xmlns='my-namespace'><leaf/>" |
| 140 "</nested><sibling/></top>"); |
| 141 EXPECT_EQ("START (top) START (my-namespace:nested, xmlns='my-namespace') " |
| 142 "START (my-namespace:leaf) END END START (sibling) END END ", |
| 143 handler.Str()); |
| 144 } |
| 145 } |
| 146 |
| 147 TEST(XmlParserTest, TestIncremental) { |
| 148 XmlParserTestHandler handler; |
| 149 XmlParser parser(&handler); |
| 150 std::string fragment; |
| 151 |
| 152 fragment = "<stream:stream"; |
| 153 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 154 EXPECT_EQ("", handler.StrClear()); |
| 155 |
| 156 fragment = " id=\"abcdefg\" xmlns=\""; |
| 157 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 158 EXPECT_EQ("", handler.StrClear()); |
| 159 |
| 160 fragment = "j:c\" xmlns:stream='hm"; |
| 161 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 162 EXPECT_EQ("", handler.StrClear()); |
| 163 |
| 164 fragment = "ph'><test"; |
| 165 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 166 EXPECT_EQ("START (hmph:stream, id='abcdefg', xmlns='j:c', " |
| 167 "http://www.w3.org/2000/xmlns/:stream='hmph') ", handler.StrClear()); |
| 168 |
| 169 fragment = "ing/><again/>abracad"; |
| 170 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 171 EXPECT_EQ("START (j:c:testing) END START (j:c:again) END TEXT (abracad) ", |
| 172 handler.StrClear()); |
| 173 |
| 174 fragment = "abra</stream:"; |
| 175 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 176 EXPECT_EQ("TEXT (abra) ", handler.StrClear()); |
| 177 |
| 178 fragment = "stream>"; |
| 179 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 180 EXPECT_EQ("END ", handler.StrClear()); |
| 181 } |
| 182 |
| 183 TEST(XmlParserTest, TestReset) { |
| 184 { |
| 185 XmlParserTestHandler handler; |
| 186 XmlParser parser(&handler); |
| 187 std::string fragment; |
| 188 |
| 189 fragment = "<top><first/><second><third></third>"; |
| 190 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 191 EXPECT_EQ("START (top) START (first) END START (second) START (third) END ", |
| 192 handler.StrClear()); |
| 193 |
| 194 parser.Reset(); |
| 195 fragment = "<tip><first/><second><third></third>"; |
| 196 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 197 EXPECT_EQ("START (tip) START (first) END START (second) START (third) END ", |
| 198 handler.StrClear()); |
| 199 } |
| 200 { |
| 201 XmlParserTestHandler handler; |
| 202 XmlParser parser(&handler); |
| 203 std::string fragment; |
| 204 |
| 205 fragment = "<top xmlns='m'>"; |
| 206 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 207 EXPECT_EQ("START (m:top, xmlns='m') ", handler.StrClear()); |
| 208 |
| 209 fragment = "<testing/><frag"; |
| 210 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 211 EXPECT_EQ("START (m:testing) END ", handler.StrClear()); |
| 212 |
| 213 parser.Reset(); |
| 214 fragment = "<testing><fragment/"; |
| 215 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 216 EXPECT_EQ("START (testing) ", handler.StrClear()); |
| 217 |
| 218 fragment = ">"; |
| 219 parser.Parse(fragment.c_str(), fragment.length(), false); |
| 220 EXPECT_EQ("START (fragment) END ", handler.StrClear()); |
| 221 } |
| 222 } |
| 223 |
| 224 TEST(XmlParserTest, TestError) { |
| 225 { |
| 226 XmlParserTestHandler handler; |
| 227 XmlParser::ParseXml(&handler, "junk"); |
| 228 EXPECT_EQ("ERROR (2) ", handler.Str()); |
| 229 } |
| 230 { |
| 231 XmlParserTestHandler handler; |
| 232 XmlParser::ParseXml(&handler, "<top/> garbage "); |
| 233 EXPECT_EQ("START (top) END ERROR (9) ", handler.Str()); |
| 234 } |
| 235 { |
| 236 XmlParserTestHandler handler; |
| 237 XmlParser::ParseXml(&handler, "<-hm->"); |
| 238 EXPECT_EQ("ERROR (4) ", handler.Str()); |
| 239 } |
| 240 { |
| 241 XmlParserTestHandler handler; |
| 242 XmlParser::ParseXml(&handler, "<hello>&foobar;</hello>"); |
| 243 EXPECT_EQ("START (hello) ERROR (11) ", handler.Str()); |
| 244 } |
| 245 { |
| 246 XmlParserTestHandler handler; |
| 247 XmlParser::ParseXml(&handler, |
| 248 "<!DOCTYPE HTML PUBLIC \"foobar\" \"barfoo\">"); |
| 249 EXPECT_EQ("ERROR (3) ", handler.Str()); |
| 250 } |
| 251 { |
| 252 // XmlParser requires utf-8 |
| 253 XmlParserTestHandler handler; |
| 254 XmlParser::ParseXml(&handler, |
| 255 "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><test/>"); |
| 256 EXPECT_EQ("ERROR (19) ", handler.Str()); |
| 257 } |
| 258 { |
| 259 // XmlParser requires version 1.0 |
| 260 XmlParserTestHandler handler; |
| 261 XmlParser::ParseXml(&handler, |
| 262 "<?xml version=\"2.0\"?><test/>"); |
| 263 EXPECT_EQ("ERROR (2) ", handler.Str()); |
| 264 } |
| 265 { |
| 266 // XmlParser requires standalone documents |
| 267 XmlParserTestHandler handler; |
| 268 XmlParser::ParseXml(&handler, |
| 269 "<?xml version=\"1.0\" standalone=\"no\"?><test/>"); |
| 270 EXPECT_EQ("ERROR (2) ", handler.Str()); |
| 271 } |
| 272 { |
| 273 // XmlParser doesn't like empty namespace URIs |
| 274 XmlParserTestHandler handler; |
| 275 XmlParser::ParseXml(&handler, |
| 276 "<test xmlns:foo='' foo:bar='huh?'>"); |
| 277 EXPECT_EQ("ERROR (2) ", handler.Str()); |
| 278 } |
| 279 } |
OLD | NEW |