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