Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: third_party/xmllite/xmlelement_unittest.cc

Issue 2443903004: Add xmllite and xmpp sources to third_party/ (Closed)
Patch Set: Restored includes in jingle/ as well Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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/xmllite/xmlelement.h"
9 #include "webrtc/base/common.h"
10 #include "webrtc/base/gunit.h"
11 #include "webrtc/base/thread.h"
12
13 using buzz::QName;
14 using buzz::XmlAttr;
15 using buzz::XmlChild;
16 using buzz::XmlElement;
17
18 std::ostream& operator<<(std::ostream& os, const QName& name) {
19 os << name.Namespace() << ":" << name.LocalPart();
20 return os;
21 }
22
23 TEST(XmlElementTest, TestConstructors) {
24 XmlElement elt(QName("google:test", "first"));
25 EXPECT_EQ("<test:first xmlns:test=\"google:test\"/>", elt.Str());
26
27 XmlElement elt2(QName("google:test", "first"), true);
28 EXPECT_EQ("<first xmlns=\"google:test\"/>", elt2.Str());
29 }
30
31 TEST(XmlElementTest, TestAdd) {
32 XmlElement elt(QName("google:test", "root"), true);
33 elt.AddElement(new XmlElement(QName("google:test", "first")));
34 elt.AddElement(new XmlElement(QName("google:test", "nested")), 1);
35 elt.AddText("nested-value", 2);
36 elt.AddText("between-", 1);
37 elt.AddText("value", 1);
38 elt.AddElement(new XmlElement(QName("google:test", "nested2")), 1);
39 elt.AddElement(new XmlElement(QName("google:test", "second")));
40 elt.AddText("init-value", 1);
41 elt.AddElement(new XmlElement(QName("google:test", "nested3")), 1);
42 elt.AddText("trailing-value", 1);
43
44 // make sure it looks ok overall
45 EXPECT_EQ("<root xmlns=\"google:test\">"
46 "<first><nested>nested-value</nested>between-value<nested2/></first>"
47 "<second>init-value<nested3/>trailing-value</second></root>",
48 elt.Str());
49
50 // make sure text was concatenated
51 XmlChild * pchild =
52 elt.FirstChild()->AsElement()->FirstChild()->NextChild();
53 EXPECT_TRUE(pchild->IsText());
54 EXPECT_EQ("between-value", pchild->AsText()->Text());
55 }
56
57 TEST(XmlElementTest, TestAttrs) {
58 XmlElement elt(QName("", "root"));
59 elt.SetAttr(QName("", "a"), "avalue");
60 EXPECT_EQ("<root a=\"avalue\"/>", elt.Str());
61
62 elt.SetAttr(QName("", "b"), "bvalue");
63 EXPECT_EQ("<root a=\"avalue\" b=\"bvalue\"/>", elt.Str());
64
65 elt.SetAttr(QName("", "a"), "avalue2");
66 EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue\"/>", elt.Str());
67
68 elt.SetAttr(QName("", "b"), "bvalue2");
69 EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\"/>", elt.Str());
70
71 elt.SetAttr(QName("", "c"), "cvalue");
72 EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\"/>", elt.Str());
73
74 XmlAttr * patt = elt.FirstAttr();
75 EXPECT_EQ(QName("", "a"), patt->Name());
76 EXPECT_EQ("avalue2", patt->Value());
77
78 patt = patt->NextAttr();
79 EXPECT_EQ(QName("", "b"), patt->Name());
80 EXPECT_EQ("bvalue2", patt->Value());
81
82 patt = patt->NextAttr();
83 EXPECT_EQ(QName("", "c"), patt->Name());
84 EXPECT_EQ("cvalue", patt->Value());
85
86 patt = patt->NextAttr();
87 EXPECT_TRUE(NULL == patt);
88
89 EXPECT_TRUE(elt.HasAttr(QName("", "a")));
90 EXPECT_TRUE(elt.HasAttr(QName("", "b")));
91 EXPECT_TRUE(elt.HasAttr(QName("", "c")));
92 EXPECT_FALSE(elt.HasAttr(QName("", "d")));
93
94 elt.SetAttr(QName("", "d"), "dvalue");
95 EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\" d=\"dvalue\"/>",
96 elt.Str());
97 EXPECT_TRUE(elt.HasAttr(QName("", "d")));
98
99 elt.ClearAttr(QName("", "z")); // not found, no effect
100 EXPECT_EQ("<root a=\"avalue2\" b=\"bvalue2\" c=\"cvalue\" d=\"dvalue\"/>",
101 elt.Str());
102
103 elt.ClearAttr(QName("", "b"));
104 EXPECT_EQ("<root a=\"avalue2\" c=\"cvalue\" d=\"dvalue\"/>", elt.Str());
105
106 elt.ClearAttr(QName("", "a"));
107 EXPECT_EQ("<root c=\"cvalue\" d=\"dvalue\"/>", elt.Str());
108
109 elt.ClearAttr(QName("", "d"));
110 EXPECT_EQ("<root c=\"cvalue\"/>", elt.Str());
111
112 elt.ClearAttr(QName("", "c"));
113 EXPECT_EQ("<root/>", elt.Str());
114 }
115
116 TEST(XmlElementTest, TestBodyText) {
117 XmlElement elt(QName("", "root"));
118 EXPECT_EQ("", elt.BodyText());
119
120 elt.AddText("body value text");
121
122 EXPECT_EQ("body value text", elt.BodyText());
123
124 elt.ClearChildren();
125 elt.AddText("more value ");
126 elt.AddText("text");
127
128 EXPECT_EQ("more value text", elt.BodyText());
129
130 elt.ClearChildren();
131 elt.AddText("decoy");
132 elt.AddElement(new XmlElement(QName("", "dummy")));
133 EXPECT_EQ("", elt.BodyText());
134
135 elt.SetBodyText("replacement");
136 EXPECT_EQ("replacement", elt.BodyText());
137
138 elt.SetBodyText("");
139 EXPECT_TRUE(NULL == elt.FirstChild());
140
141 elt.SetBodyText("goodbye");
142 EXPECT_EQ("goodbye", elt.FirstChild()->AsText()->Text());
143 EXPECT_EQ("goodbye", elt.BodyText());
144 }
145
146 TEST(XmlElementTest, TestCopyConstructor) {
147 XmlElement * element = XmlElement::ForStr(
148 "<root xmlns='test-foo'>This is a <em a='avalue' b='bvalue'>"
149 "little <b>little</b></em> test</root>");
150
151 XmlElement * pelCopy = new XmlElement(*element);
152 EXPECT_EQ("<root xmlns=\"test-foo\">This is a <em a=\"avalue\" b=\"bvalue\">"
153 "little <b>little</b></em> test</root>", pelCopy->Str());
154 delete pelCopy;
155
156 pelCopy = new XmlElement(*(element->FirstChild()->NextChild()->AsElement()));
157 EXPECT_EQ("<foo:em a=\"avalue\" b=\"bvalue\" xmlns:foo=\"test-foo\">"
158 "little <foo:b>little</foo:b></foo:em>", pelCopy->Str());
159
160 XmlAttr * patt = pelCopy->FirstAttr();
161 EXPECT_EQ(QName("", "a"), patt->Name());
162 EXPECT_EQ("avalue", patt->Value());
163
164 patt = patt->NextAttr();
165 EXPECT_EQ(QName("", "b"), patt->Name());
166 EXPECT_EQ("bvalue", patt->Value());
167
168 patt = patt->NextAttr();
169 EXPECT_TRUE(NULL == patt);
170 delete pelCopy;
171 delete element;
172 }
173
174 TEST(XmlElementTest, TestNameSearch) {
175 XmlElement * element = XmlElement::ForStr(
176 "<root xmlns='test-foo'>"
177 "<firstname>George</firstname>"
178 "<middlename>X.</middlename>"
179 "some text"
180 "<lastname>Harrison</lastname>"
181 "<firstname>John</firstname>"
182 "<middlename>Y.</middlename>"
183 "<lastname>Lennon</lastname>"
184 "</root>");
185 EXPECT_TRUE(NULL ==
186 element->FirstNamed(QName("", "firstname")));
187 EXPECT_EQ(element->FirstChild(),
188 element->FirstNamed(QName("test-foo", "firstname")));
189 EXPECT_EQ(element->FirstChild()->NextChild(),
190 element->FirstNamed(QName("test-foo", "middlename")));
191 EXPECT_EQ(element->FirstElement()->NextElement(),
192 element->FirstNamed(QName("test-foo", "middlename")));
193 EXPECT_EQ("Harrison",
194 element->TextNamed(QName("test-foo", "lastname")));
195 EXPECT_EQ(element->FirstElement()->NextElement()->NextElement(),
196 element->FirstNamed(QName("test-foo", "lastname")));
197 EXPECT_EQ("John", element->FirstNamed(QName("test-foo", "firstname"))->
198 NextNamed(QName("test-foo", "firstname"))->BodyText());
199 EXPECT_EQ("Y.", element->FirstNamed(QName("test-foo", "middlename"))->
200 NextNamed(QName("test-foo", "middlename"))->BodyText());
201 EXPECT_EQ("Lennon", element->FirstNamed(QName("test-foo", "lastname"))->
202 NextNamed(QName("test-foo", "lastname"))->BodyText());
203 EXPECT_TRUE(NULL == element->FirstNamed(QName("test-foo", "firstname"))->
204 NextNamed(QName("test-foo", "firstname"))->
205 NextNamed(QName("test-foo", "firstname")));
206
207 delete element;
208 }
209
210 class XmlElementCreatorThread : public rtc::Thread {
211 public:
212 XmlElementCreatorThread(int count, buzz::QName qname) :
213 count_(count), qname_(qname) {}
214
215 virtual ~XmlElementCreatorThread() {
216 Stop();
217 }
218
219 virtual void Run() {
220 std::vector<buzz::XmlElement*> elems;
221 for (int i = 0; i < count_; i++) {
222 elems.push_back(new XmlElement(qname_));
223 }
224 for (int i = 0; i < count_; i++) {
225 delete elems[i];
226 }
227 }
228
229 private:
230 int count_;
231 buzz::QName qname_;
232 };
233
234 // If XmlElement creation and destruction isn't thread safe,
235 // this test should crash.
236 TEST(XmlElementTest, TestMultithread) {
237 int thread_count = 2; // Was 100, but that's too slow.
238 int elem_count = 100; // Was 100000, but that's too slow.
239 buzz::QName qname("foo", "bar");
240
241 std::vector<rtc::Thread*> threads;
242 for (int i = 0; i < thread_count; i++) {
243 threads.push_back(
244 new XmlElementCreatorThread(elem_count, qname));
245 threads[i]->Start();
246 }
247
248 for (int i = 0; i < thread_count; i++) {
249 threads[i]->Stop();
250 delete threads[i];
251 }
252 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698