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/xmlelement.h" 1548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/common.h" 1648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/gunit.h" 1748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org#include "webrtc/base/thread.h" 1848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 1948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::QName; 2048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlAttr; 2148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlChild; 2248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgusing buzz::XmlElement; 2348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 2448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgstd::ostream& operator<<(std::ostream& os, const QName& name) { 2548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org os << name.Namespace() << ":" << name.LocalPart(); 2648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org return os; 2748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 2848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 2948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestConstructors) { 3048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement elt(QName("google:test", "first")); 3148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<test:first xmlns:test=\"google:test\"/>", elt.Str()); 3248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 3348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement elt2(QName("google:test", "first"), true); 3448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<first xmlns=\"google:test\"/>", elt2.Str()); 3548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 3648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 3748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestAdd) { 3848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement elt(QName("google:test", "root"), true); 3948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("google:test", "first"))); 4048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("google:test", "nested")), 1); 4148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("nested-value", 2); 4248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("between-", 1); 4348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("value", 1); 4448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("google:test", "nested2")), 1); 4548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("google:test", "second"))); 4648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("init-value", 1); 4748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("google:test", "nested3")), 1); 4848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("trailing-value", 1); 4948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 5048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org // make sure it looks ok overall 5148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root xmlns=\"google:test\">" 5248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<first><nested>nested-value</nested>between-value<nested2/></first>" 5348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<second>init-value<nested3/>trailing-value</second></root>", 5448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.Str()); 5548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 5648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org // make sure text was concatenated 5748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlChild * pchild = 5848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.FirstChild()->AsElement()->FirstChild()->NextChild(); 5948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(pchild->IsText()); 6048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("between-value", pchild->AsText()->Text()); 6148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 6248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 6348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestAttrs) { 6448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement elt(QName("", "root")); 6548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "a"), "avalue"); 6648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue\"/>", elt.Str()); 6748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 6848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "b"), "bvalue"); 6948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue\" b=\"bvalue\"/>", elt.Str()); 7048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 7148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "a"), "avalue2"); 7248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue\"/>", elt.Str()); 7348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 7448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "b"), "bvalue2"); 7548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\"/>", elt.Str()); 7648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 7748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "c"), "cvalue"); 7848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\"/>", elt.Str()); 7948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 8048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlAttr * patt = elt.FirstAttr(); 8148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(QName("", "a"), patt->Name()); 8248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("avalue2", patt->Value()); 8348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 8448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org patt = patt->NextAttr(); 8548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(QName("", "b"), patt->Name()); 8648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("bvalue2", patt->Value()); 8748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 8848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org patt = patt->NextAttr(); 8948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(QName("", "c"), patt->Name()); 9048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("cvalue", patt->Value()); 9148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 9248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org patt = patt->NextAttr(); 9348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(NULL == patt); 9448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 9548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(elt.HasAttr(QName("", "a"))); 9648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(elt.HasAttr(QName("", "b"))); 9748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(elt.HasAttr(QName("", "c"))); 9848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_FALSE(elt.HasAttr(QName("", "d"))); 9948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 10048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetAttr(QName("", "d"), "dvalue"); 10148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\" d=\"dvalue\"/>", 10248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.Str()); 10348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(elt.HasAttr(QName("", "d"))); 10448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 10548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearAttr(QName("", "z")); // not found, no effect 10648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\" d=\"dvalue\"/>", 10748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.Str()); 10848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 10948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearAttr(QName("", "b")); 11048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root a=\"avalue2\" c=\"cvalue\" d=\"dvalue\"/>", elt.Str()); 11148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 11248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearAttr(QName("", "a")); 11348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root c=\"cvalue\" d=\"dvalue\"/>", elt.Str()); 11448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 11548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearAttr(QName("", "d")); 11648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root c=\"cvalue\"/>", elt.Str()); 11748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 11848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearAttr(QName("", "c")); 11948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root/>", elt.Str()); 12048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 12148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 12248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestBodyText) { 12348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement elt(QName("", "root")); 12448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("", elt.BodyText()); 12548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 12648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("body value text"); 12748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 12848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("body value text", elt.BodyText()); 12948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 13048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearChildren(); 13148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("more value "); 13248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("text"); 13348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 13448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("more value text", elt.BodyText()); 13548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 13648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.ClearChildren(); 13748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddText("decoy"); 13848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.AddElement(new XmlElement(QName("", "dummy"))); 13948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("", elt.BodyText()); 14048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 14148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetBodyText("replacement"); 14248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("replacement", elt.BodyText()); 14348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 14448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetBodyText(""); 14548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(NULL == elt.FirstChild()); 14648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 14748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elt.SetBodyText("goodbye"); 14848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("goodbye", elt.FirstChild()->AsText()->Text()); 14948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("goodbye", elt.BodyText()); 15048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 15148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 15248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestCopyConstructor) { 15348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement * element = XmlElement::ForStr( 15448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<root xmlns='test-foo'>This is a <em a='avalue' b='bvalue'>" 15548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "little <b>little</b></em> test</root>"); 15648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 15748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement * pelCopy = new XmlElement(*element); 15848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<root xmlns=\"test-foo\">This is a <em a=\"avalue\" b=\"bvalue\">" 15948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "little <b>little</b></em> test</root>", pelCopy->Str()); 16048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete pelCopy; 16148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 16248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org pelCopy = new XmlElement(*(element->FirstChild()->NextChild()->AsElement())); 16348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("<foo:em a=\"avalue\" b=\"bvalue\" xmlns:foo=\"test-foo\">" 16448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "little <foo:b>little</foo:b></foo:em>", pelCopy->Str()); 16548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 16648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlAttr * patt = pelCopy->FirstAttr(); 16748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(QName("", "a"), patt->Name()); 16848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("avalue", patt->Value()); 16948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 17048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org patt = patt->NextAttr(); 17148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(QName("", "b"), patt->Name()); 17248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("bvalue", patt->Value()); 17348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 17448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org patt = patt->NextAttr(); 17548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(NULL == patt); 17648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete pelCopy; 17748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete element; 17848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 17948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 18048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestNameSearch) { 18148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElement * element = XmlElement::ForStr( 18248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<root xmlns='test-foo'>" 18348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<firstname>George</firstname>" 18448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<middlename>X.</middlename>" 18548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "some text" 18648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<lastname>Harrison</lastname>" 18748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<firstname>John</firstname>" 18848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<middlename>Y.</middlename>" 18948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "<lastname>Lennon</lastname>" 19048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org "</root>"); 19148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(NULL == 19248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->FirstNamed(QName("", "firstname"))); 19348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(element->FirstChild(), 19448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->FirstNamed(QName("test-foo", "firstname"))); 19548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(element->FirstChild()->NextChild(), 19648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->FirstNamed(QName("test-foo", "middlename"))); 19748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(element->FirstElement()->NextElement(), 19848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->FirstNamed(QName("test-foo", "middlename"))); 19948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("Harrison", 20048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->TextNamed(QName("test-foo", "lastname"))); 20148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ(element->FirstElement()->NextElement()->NextElement(), 20248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org element->FirstNamed(QName("test-foo", "lastname"))); 20348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("John", element->FirstNamed(QName("test-foo", "firstname"))-> 20448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org NextNamed(QName("test-foo", "firstname"))->BodyText()); 20548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("Y.", element->FirstNamed(QName("test-foo", "middlename"))-> 20648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org NextNamed(QName("test-foo", "middlename"))->BodyText()); 20748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_EQ("Lennon", element->FirstNamed(QName("test-foo", "lastname"))-> 20848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org NextNamed(QName("test-foo", "lastname"))->BodyText()); 20948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org EXPECT_TRUE(NULL == element->FirstNamed(QName("test-foo", "firstname"))-> 21048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org NextNamed(QName("test-foo", "firstname"))-> 21148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org NextNamed(QName("test-foo", "firstname"))); 21248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 21348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete element; 21448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 21548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 21648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgclass XmlElementCreatorThread : public rtc::Thread { 21748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org public: 21848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org XmlElementCreatorThread(int count, buzz::QName qname) : 21948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org count_(count), qname_(qname) {} 22048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 22148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org virtual ~XmlElementCreatorThread() { 22248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org Stop(); 22348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 22448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 22548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org virtual void Run() { 22648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org std::vector<buzz::XmlElement*> elems; 22748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org for (int i = 0; i < count_; i++) { 22848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org elems.push_back(new XmlElement(qname_)); 22948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 23048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org for (int i = 0; i < count_; i++) { 23148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete elems[i]; 23248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 23348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 23448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 23548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org private: 23648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org int count_; 23748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org buzz::QName qname_; 23848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org}; 23948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 24048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org// If XmlElement creation and destruction isn't thread safe, 24148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org// this test should crash. 24248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.orgTEST(XmlElementTest, TestMultithread) { 24348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org int thread_count = 2; // Was 100, but that's too slow. 24448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org int elem_count = 100; // Was 100000, but that's too slow. 24548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org buzz::QName qname("foo", "bar"); 24648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 24748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org std::vector<rtc::Thread*> threads; 24848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org for (int i = 0; i < thread_count; i++) { 24948a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org threads.push_back( 25048a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org new XmlElementCreatorThread(elem_count, qname)); 25148a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org threads[i]->Start(); 25248a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 25348a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org 25448a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org for (int i = 0; i < thread_count; i++) { 25548a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org threads[i]->Stop(); 25648a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org delete threads[i]; 25748a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org } 25848a7b2e84057589be933b5182cded67c9885f8e8henrike@webrtc.org} 259