Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/python -u
      2 #
      3 # this test exercise the XPath basic engine, parser, etc, and
      4 # allows to detect memory leaks
      5 #
      6 import sys
      7 import libxml2
      8 
      9 instance="""<?xml version="1.0"?>
     10 <tag xmlns:foo='urn:foo' xmlns:bar='urn:bar' xmlns:baz='urn:baz' />"""
     11 
     12 def namespaceDefs(node):
     13     n = node.nsDefs()
     14     while n:
     15         yield n
     16         n = n.next
     17 
     18 def checkNamespaceDefs(node, count):
     19     nsList = list(namespaceDefs(node))
     20     #print nsList
     21     if len(nsList) != count :
     22         raise Exception("Error: saw %d namespace declarations.  Expected %d" % (len(nsList), count))
     23     
     24 # Memory debug specific
     25 libxml2.debugMemory(1)
     26 
     27 # Remove single namespace
     28 doc = libxml2.parseDoc(instance)
     29 node = doc.getRootElement()
     30 checkNamespaceDefs(node, 3)
     31 ns = node.removeNsDef('urn:bar')
     32 checkNamespaceDefs(node, 2)
     33 ns.freeNsList()
     34 doc.freeDoc()
     35 
     36 # Remove all namespaces
     37 doc = libxml2.parseDoc(instance)
     38 node = doc.getRootElement()
     39 checkNamespaceDefs(node, 3)
     40 ns = node.removeNsDef(None)
     41 checkNamespaceDefs(node, 0)
     42 ns.freeNsList()
     43 doc.freeDoc()
     44 
     45 # Remove a namespace refered to by a child
     46 doc = libxml2.newDoc("1.0")
     47 root = doc.newChild(None, "root", None)
     48 namespace = root.newNs("http://example.com/sample", "s")
     49 child = root.newChild(namespace, "child", None)
     50 root.removeNsDef("http://example.com/sample")
     51 doc.reconciliateNs(root)
     52 namespace.freeNsList()
     53 doc.serialize() # This should not segfault
     54 doc.freeDoc()
     55 
     56 # Memory debug specific
     57 libxml2.cleanupParser()
     58 if libxml2.debugMemory(1) == 0:
     59     print("OK")
     60 else:
     61     print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
     62     libxml2.dumpMemory()
     63