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