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