10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <iostream> 29cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <sstream> 30cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <string> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlbuilder.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlelement.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmllite/xmlparser.h" 34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/common.h" 35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing buzz::XmlBuilder; 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing buzz::XmlElement; 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing buzz::XmlParser; 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestTrivial) { 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing/>"); 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing/>", builder.BuiltElement()->Str()); 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestAttributes1) { 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='b'/>"); 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\"b\"/>", builder.BuiltElement()->Str()); 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestAttributes2) { 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing e='' long='some text'/>"); 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing e=\"\" long=\"some text\"/>", 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNesting1) { 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<top><first/><second><third></third></second></top>"); 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<top><first/><second><third/></second></top>", 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNesting2) { 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<top><fifth><deeper><and><deeper/></and><sibling><leaf/>" 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</sibling></deeper></fifth><first/><second><third></third>" 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</second></top>"); 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<top><fifth><deeper><and><deeper/></and><sibling><leaf/>" 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</sibling></deeper></fifth><first/><second><third/>" 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</second></top>", builder.BuiltElement()->Str()); 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting1) { 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='>'/>"); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\">\"/>", builder.BuiltElement()->Str()); 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting2) { 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='<>&"'/>"); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\"<>&"\"/>", 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting3) { 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='so "important"'/>"); 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\"so "important"\"/>", 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting4) { 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='"important", yes'/>"); 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\""important", yes\"/>", 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting5) { 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<testing a='<what is "important">'/>"); 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing a=\"<what is "important">\"/>", 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestText1) { 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing>></testing>"); 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing>></testing>", builder.BuiltElement()->Str()); 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestText2) { 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing><>&"</testing>"); 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing><>&\"</testing>", 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestText3) { 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing>so <important></testing>"); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing>so <important></testing>", 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestText4) { 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing><important>, yes</testing>"); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing><important>, yes</testing>", 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestText5) { 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<testing>importance &<important>&</testing>"); 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing>importance &<important>&</testing>", 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace1) { 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing xmlns='foo'/>"); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing xmlns=\"foo\"/>", builder.BuiltElement()->Str()); 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace2) { 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing xmlns:a='foo' a:b='c'/>"); 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("<testing xmlns:a=\"foo\" a:b=\"c\"/>", 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org builder.BuiltElement()->Str()); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace3) { 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing xmlns:a=''/>"); 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(NULL == builder.BuiltElement()); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace4) { 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a:b='c'/>"); 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(NULL == builder.BuiltElement()); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision1) { 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, "<testing a='first' a='second'/>"); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(NULL == builder.BuiltElement()); 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision2) { 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<testing xmlns:a='foo' xmlns:b='foo' a:x='c' b:x='d'/>"); 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(NULL == builder.BuiltElement()); 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision3) { 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlBuilder builder; 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org XmlParser::ParseXml(&builder, 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<testing xmlns:a='foo'><nested xmlns:b='foo' a:x='c' b:x='d'/>" 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</testing>"); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(NULL == builder.BuiltElement()); 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 195