148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org/*
248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *
448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org */
1048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
1148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include <iostream>
1248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include <sstream>
1348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include <string>
1448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlbuilder.h"
1548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlelement.h"
1648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlparser.h"
1748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/common.h"
1848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/gunit.h"
1948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
2048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlBuilder;
2148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlElement;
2248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlParser;
2348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
2448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestTrivial) {
2548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
2648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing/>");
2748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing/>", builder.BuiltElement()->Str());
2848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
2948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
3048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestAttributes1) {
3148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
3248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='b'/>");
3348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"b\"/>", builder.BuiltElement()->Str());
3448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
3548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
3648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestAttributes2) {
3748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
3848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing e='' long='some text'/>");
3948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing e=\"\" long=\"some text\"/>",
4048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
4148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
4248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
4348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNesting1) {
4448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
4548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
4648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "<top><first/><second><third></third></second></top>");
4748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<top><first/><second><third/></second></top>",
4848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
4948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
5048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
5148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNesting2) {
5248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
5348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
5448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    "<top><fifth><deeper><and><deeper/></and><sibling><leaf/>"
5548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    "</sibling></deeper></fifth><first/><second><third></third>"
5648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    "</second></top>");
5748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<top><fifth><deeper><and><deeper/></and><sibling><leaf/>"
5848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    "</sibling></deeper></fifth><first/><second><third/>"
5948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org    "</second></top>", builder.BuiltElement()->Str());
6048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
6148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
6248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting1) {
6348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
6448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='>'/>");
6548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"&gt;\"/>", builder.BuiltElement()->Str());
6648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
6748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
6848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting2) {
6948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
7048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='&lt;>&amp;&quot;'/>");
7148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"&lt;&gt;&amp;&quot;\"/>",
7248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
7348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
7448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
7548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting3) {
7648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
7748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='so &quot;important&quot;'/>");
7848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"so &quot;important&quot;\"/>",
7948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
8048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
8148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
8248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting4) {
8348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
8448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='&quot;important&quot;, yes'/>");
8548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"&quot;important&quot;, yes\"/>",
8648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
8748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
8848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
8948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestQuoting5) {
9048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
9148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
9248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "<testing a='&lt;what is &quot;important&quot;&gt;'/>");
9348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing a=\"&lt;what is &quot;important&quot;&gt;\"/>",
9448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
9548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
9648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
9748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestText1) {
9848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
9948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing>></testing>");
10048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing>&gt;</testing>", builder.BuiltElement()->Str());
10148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
10248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
10348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestText2) {
10448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
10548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing>&lt;>&amp;&quot;</testing>");
10648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing>&lt;&gt;&amp;\"</testing>",
10748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
10848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
10948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
11048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestText3) {
11148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
11248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing>so &lt;important&gt;</testing>");
11348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing>so &lt;important&gt;</testing>",
11448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
11548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
11648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
11748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestText4) {
11848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
11948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing>&lt;important&gt;, yes</testing>");
12048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing>&lt;important&gt;, yes</testing>",
12148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
12248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
12348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
12448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestText5) {
12548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
12648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
12748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "<testing>importance &amp;&lt;important&gt;&amp;</testing>");
12848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing>importance &amp;&lt;important&gt;&amp;</testing>",
12948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
13048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
13148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
13248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace1) {
13348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
13448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing xmlns='foo'/>");
13548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing xmlns=\"foo\"/>", builder.BuiltElement()->Str());
13648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
13748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
13848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace2) {
13948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
14048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing xmlns:a='foo' a:b='c'/>");
14148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_EQ("<testing xmlns:a=\"foo\" a:b=\"c\"/>",
14248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      builder.BuiltElement()->Str());
14348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
14448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
14548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace3) {
14648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
14748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing xmlns:a=''/>");
14848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_TRUE(NULL == builder.BuiltElement());
14948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
15048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
15148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestNamespace4) {
15248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
15348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a:b='c'/>");
15448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_TRUE(NULL == builder.BuiltElement());
15548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
15648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
15748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision1) {
15848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
15948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder, "<testing a='first' a='second'/>");
16048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_TRUE(NULL == builder.BuiltElement());
16148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
16248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
16348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision2) {
16448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
16548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
16648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "<testing xmlns:a='foo' xmlns:b='foo' a:x='c' b:x='d'/>");
16748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_TRUE(NULL == builder.BuiltElement());
16848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
16948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
17048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlBuilderTest, TestAttrCollision3) {
17148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlBuilder builder;
17248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  XmlParser::ParseXml(&builder,
17348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "<testing xmlns:a='foo'><nested xmlns:b='foo' a:x='c' b:x='d'/>"
17448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org      "</testing>");
17548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org  EXPECT_TRUE(NULL == builder.BuiltElement());
17648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}
17748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org
178