1 #!/usr/bin/env python3
2 # -*- coding: ISO-8859-1 -*-
3 #
4 # this tests the basic APIs of the XmlTextReader interface
5 #
6 import setup_test
7 import libxml2
8 import sys
9 try:
10 import StringIO
11 str_io = StringIO.StringIO
12 except:
13 import io
14 str_io = io.StringIO
15
16 # Memory debug specific
17 libxml2.debugMemory(1)
18
19 f = str_io("""<a><b b1="b1"/><c>content of c</c></a>""")
20 input = libxml2.inputBuffer(f)
21 reader = input.newTextReader("test1")
22 ret = reader.Read()
23 if ret != 1:
24 print("test1: Error reading to first element")
25 sys.exit(1)
26 if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
27 reader.NodeType() != 1 or reader.HasAttributes() != 0:
28 print("test1: Error reading the first element")
29 sys.exit(1)
30 ret = reader.Read()
31 if ret != 1:
32 print("test1: Error reading to second element")
33 sys.exit(1)
34 if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \
35 reader.NodeType() != 1 or reader.HasAttributes() != 1:
36 print("test1: Error reading the second element")
37 sys.exit(1)
38 ret = reader.Read()
39 if ret != 1:
40 print("test1: Error reading to third element")
41 sys.exit(1)
42 if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
43 reader.NodeType() != 1 or reader.HasAttributes() != 0:
44 print("test1: Error reading the third element")
45 sys.exit(1)
46 ret = reader.Read()
47 if ret != 1:
48 print("test1: Error reading to text node")
49 sys.exit(1)
50 if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \
51 reader.NodeType() != 3 or reader.HasAttributes() != 0 or \
52 reader.Value() != "content of c":
53 print("test1: Error reading the text node")
54 sys.exit(1)
55 ret = reader.Read()
56 if ret != 1:
57 print("test1: Error reading to end of third element")
58 sys.exit(1)
59 if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
60 reader.NodeType() != 15 or reader.HasAttributes() != 0:
61 print("test1: Error reading the end of third element")
62 sys.exit(1)
63 ret = reader.Read()
64 if ret != 1:
65 print("test1: Error reading to end of first element")
66 sys.exit(1)
67 if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
68 reader.NodeType() != 15 or reader.HasAttributes() != 0:
69 print("test1: Error reading the end of first element")
70 sys.exit(1)
71 ret = reader.Read()
72 if ret != 0:
73 print("test1: Error reading to end of document")
74 sys.exit(1)
75
76 #
77 # example from the XmlTextReader docs
78 #
79 f = str_io("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
80 input = libxml2.inputBuffer(f)
81 reader = input.newTextReader("test2")
82
83 ret = reader.Read()
84 if ret != 1:
85 print("Error reading test element")
86 sys.exit(1)
87 if reader.GetAttributeNo(0) != "urn:datatypes" or \
88 reader.GetAttributeNo(1) != "int" or \
89 reader.GetAttributeNs("type", "urn:datatypes") != "int" or \
90 reader.GetAttribute("dt:type") != "int":
91 print("error reading test attributes")
92 sys.exit(1)
93
94 #
95 # example from the XmlTextReader docs
96 #
97 f = str_io("""<root xmlns:a="urn:456">
98 <item>
99 <ref href="a:b"/>
100 </item>
101 </root>""")
102 input = libxml2.inputBuffer(f)
103 reader = input.newTextReader("test3")
104
105 ret = reader.Read()
106 while ret == 1:
107 if reader.Name() == "ref":
108 if reader.LookupNamespace("a") != "urn:456":
109 print("error resolving namespace prefix")
110 sys.exit(1)
111 break
112 ret = reader.Read()
113 if ret != 1:
114 print("Error finding the ref element")
115 sys.exit(1)
116
117 #
118 # Home made example for the various attribute access functions
119 #
120 f = str_io("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
121 input = libxml2.inputBuffer(f)
122 reader = input.newTextReader("test4")
123 ret = reader.Read()
124 if ret != 1:
125 print("Error reading the testattr element")
126 sys.exit(1)
127 #
128 # Attribute exploration by index
129 #
130 if reader.MoveToAttributeNo(0) != 1:
131 print("Failed moveToAttribute(0)")
132 sys.exit(1)
133 if reader.Value() != "urn:1":
134 print("Failed to read attribute(0)")
135 sys.exit(1)
136 if reader.Name() != "xmlns":
137 print("Failed to read attribute(0) name")
138 sys.exit(1)
139 if reader.MoveToAttributeNo(1) != 1:
140 print("Failed moveToAttribute(1)")
141 sys.exit(1)
142 if reader.Value() != "urn:2":
143 print("Failed to read attribute(1)")
144 sys.exit(1)
145 if reader.Name() != "xmlns:a":
146 print("Failed to read attribute(1) name")
147 sys.exit(1)
148 if reader.MoveToAttributeNo(2) != 1:
149 print("Failed moveToAttribute(2)")
150 sys.exit(1)
151 if reader.Value() != "b":
152 print("Failed to read attribute(2)")
153 sys.exit(1)
154 if reader.Name() != "b":
155 print("Failed to read attribute(2) name")
156 sys.exit(1)
157 if reader.MoveToAttributeNo(3) != 1:
158 print("Failed moveToAttribute(3)")
159 sys.exit(1)
160 if reader.Value() != "a:b":
161 print("Failed to read attribute(3)")
162 sys.exit(1)
163 if reader.Name() != "a:b":
164 print("Failed to read attribute(3) name")
165 sys.exit(1)
166 #
167 # Attribute exploration by name
168 #
169 if reader.MoveToAttribute("xmlns") != 1:
170 print("Failed moveToAttribute('xmlns')")
171 sys.exit(1)
172 if reader.Value() != "urn:1":
173 print("Failed to read attribute('xmlns')")
174 sys.exit(1)
175 if reader.MoveToAttribute("xmlns:a") != 1:
176 print("Failed moveToAttribute('xmlns')")
177 sys.exit(1)
178 if reader.Value() != "urn:2":
179 print("Failed to read attribute('xmlns:a')")
180 sys.exit(1)
181 if reader.MoveToAttribute("b") != 1:
182 print("Failed moveToAttribute('b')")
183 sys.exit(1)
184 if reader.Value() != "b":
185 print("Failed to read attribute('b')")
186 sys.exit(1)
187 if reader.MoveToAttribute("a:b") != 1:
188 print("Failed moveToAttribute('a:b')")
189 sys.exit(1)
190 if reader.Value() != "a:b":
191 print("Failed to read attribute('a:b')")
192 sys.exit(1)
193 if reader.MoveToAttributeNs("b", "urn:2") != 1:
194 print("Failed moveToAttribute('b', 'urn:2')")
195 sys.exit(1)
196 if reader.Value() != "a:b":
197 print("Failed to read attribute('b', 'urn:2')")
198 sys.exit(1)
199 #
200 # Go back and read in sequence
201 #
202 if reader.MoveToElement() != 1:
203 print("Failed to move back to element")
204 sys.exit(1)
205 if reader.MoveToFirstAttribute() != 1:
206 print("Failed to move to first attribute")
207 sys.exit(1)
208 if reader.Value() != "urn:1":
209 print("Failed to read attribute(0)")
210 sys.exit(1)
211 if reader.Name() != "xmlns":
212 print("Failed to read attribute(0) name")
213 sys.exit(1)
214 if reader.MoveToNextAttribute() != 1:
215 print("Failed to move to next attribute")
216 sys.exit(1)
217 if reader.Value() != "urn:2":
218 print("Failed to read attribute(1)")
219 sys.exit(1)
220 if reader.Name() != "xmlns:a":
221 print("Failed to read attribute(1) name")
222 sys.exit(1)
223 if reader.MoveToNextAttribute() != 1:
224 print("Failed to move to next attribute")
225 sys.exit(1)
226 if reader.Value() != "b":
227 print("Failed to read attribute(2)")
228 sys.exit(1)
229 if reader.Name() != "b":
230 print("Failed to read attribute(2) name")
231 sys.exit(1)
232 if reader.MoveToNextAttribute() != 1:
233 print("Failed to move to next attribute")
234 sys.exit(1)
235 if reader.Value() != "a:b":
236 print("Failed to read attribute(3)")
237 sys.exit(1)
238 if reader.Name() != "a:b":
239 print("Failed to read attribute(3) name")
240 sys.exit(1)
241 if reader.MoveToNextAttribute() != 0:
242 print("Failed to detect last attribute")
243 sys.exit(1)
244
245
246 #
247 # a couple of tests for namespace nodes
248 #
249 f = str_io("""<a xmlns="http://example.com/foo"/>""")
250 input = libxml2.inputBuffer(f)
251 reader = input.newTextReader("test6")
252 ret = reader.Read()
253 if ret != 1:
254 print("test6: failed to Read()")
255 sys.exit(1)
256 ret = reader.MoveToFirstAttribute()
257 if ret != 1:
258 print("test6: failed to MoveToFirstAttribute()")
259 sys.exit(1)
260 if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
261 reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \
262 reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
263 print("test6: failed to read the namespace node")
264 sys.exit(1)
265
266 f = str_io("""<a xmlns:prefix="http://example.com/foo"/>""")
267 input = libxml2.inputBuffer(f)
268 reader = input.newTextReader("test7")
269 ret = reader.Read()
270 if ret != 1:
271 print("test7: failed to Read()")
272 sys.exit(1)
273 ret = reader.MoveToFirstAttribute()
274 if ret != 1:
275 print("test7: failed to MoveToFirstAttribute()")
276 sys.exit(1)
277 if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
278 reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \
279 reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
280 print("test7: failed to read the namespace node")
281 sys.exit(1)
282
283 #
284 # Test for a limit case:
285 #
286 f = str_io("""<a/>""")
287 input = libxml2.inputBuffer(f)
288 reader = input.newTextReader("test8")
289 ret = reader.Read()
290 if ret != 1:
291 print("test8: failed to read the node")
292 sys.exit(1)
293 if reader.Name() != "a" or reader.IsEmptyElement() != 1:
294 print("test8: failed to analyze the node")
295 sys.exit(1)
296 ret = reader.Read()
297 if ret != 0:
298 print("test8: failed to detect the EOF")
299 sys.exit(1)
300
301 #
302 # Another test provided by St�phane Bidoul and checked with C#
303 #
304 def tst_reader(s):
305 f = str_io(s)
306 input = libxml2.inputBuffer(f)
307 reader = input.newTextReader("tst")
308 res = ""
309 while reader.Read():
310 res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(),
311 reader.Value(), reader.IsEmptyElement(),
312 reader.Depth())
313 if reader.NodeType() == 1: # Element
314 while reader.MoveToNextAttribute():
315 res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(),
316 reader.Name(),reader.Value(),
317 reader.IsEmptyElement(), reader.Depth())
318 return res
319
320 doc="""<a><b b1="b1"/><c>content of c</c></a>"""
321 expect="""1 (a) [None] 0 0
322 1 (b) [None] 1 1
323 -- 2 (b1) [b1] 0 2
324 1 (c) [None] 0 1
325 3 (#text) [content of c] 0 2
326 15 (c) [None] 0 1
327 15 (a) [None] 0 0
328 """
329 res = tst_reader(doc)
330 if res != expect:
331 print("test5 failed")
332 print(res)
333 sys.exit(1)
334
335 doc="""<test><b/><c/></test>"""
336 expect="""1 (test) [None] 0 0
337 1 (b) [None] 1 1
338 1 (c) [None] 1 1
339 15 (test) [None] 0 0
340 """
341 res = tst_reader(doc)
342 if res != expect:
343 print("test9 failed")
344 print(res)
345 sys.exit(1)
346
347 doc="""<a><b>bbb</b><c>ccc</c></a>"""
348 expect="""1 (a) [None] 0 0
349 1 (b) [None] 0 1
350 3 (#text) [bbb] 0 2
351 15 (b) [None] 0 1
352 1 (c) [None] 0 1
353 3 (#text) [ccc] 0 2
354 15 (c) [None] 0 1
355 15 (a) [None] 0 0
356 """
357 res = tst_reader(doc)
358 if res != expect:
359 print("test10 failed")
360 print(res)
361 sys.exit(1)
362
363 doc="""<test a="a"/>"""
364 expect="""1 (test) [None] 1 0
365 -- 2 (a) [a] 0 1
366 """
367 res = tst_reader(doc)
368 if res != expect:
369 print("test11 failed")
370 print(res)
371 sys.exit(1)
372
373 doc="""<test><a>aaa</a><b/></test>"""
374 expect="""1 (test) [None] 0 0
375 1 (a) [None] 0 1
376 3 (#text) [aaa] 0 2
377 15 (a) [None] 0 1
378 1 (b) [None] 1 1
379 15 (test) [None] 0 0
380 """
381 res = tst_reader(doc)
382 if res != expect:
383 print("test12 failed")
384 print(res)
385 sys.exit(1)
386
387 doc="""<test><p></p></test>"""
388 expect="""1 (test) [None] 0 0
389 1 (p) [None] 0 1
390 15 (p) [None] 0 1
391 15 (test) [None] 0 0
392 """
393 res = tst_reader(doc)
394 if res != expect:
395 print("test13 failed")
396 print(res)
397 sys.exit(1)
398
399 doc="""<p></p>"""
400 expect="""1 (p) [None] 0 0
401 15 (p) [None] 0 0
402 """
403 res = tst_reader(doc)
404 if res != expect:
405 print("test14 failed")
406 print(res)
407 sys.exit(1)
408
409 #
410 # test from bug #108801
411 #
412 doc="""<?xml version="1.0" standalone="no"?>
413 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
414 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
415 ]>
416
417 <article>
418 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
419 </article>
420 """
421 expect="""10 (article) [None] 0 0
422 1 (article) [None] 0 0
423 3 (#text) [
424 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
425 ] 0 1
426 15 (article) [None] 0 0
427 """
428 res = tst_reader(doc)
429 if res != expect:
430 print("test15 failed")
431 print(res)
432 sys.exit(1)
433
434 #
435 # cleanup for memory allocation counting
436 #
437 del f
438 del input
439 del reader
440
441 # Memory debug specific
442 libxml2.cleanupParser()
443 if libxml2.debugMemory(1) == 0:
444 print("OK")
445 else:
446 print("Memory leak %d bytes" % (libxml2.debugMemory(1)))