1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*7c568831SAndroid Build Coastguard Workerimport sys 3*7c568831SAndroid Build Coastguard Workerimport setup_test 4*7c568831SAndroid Build Coastguard Workerimport libxml2 5*7c568831SAndroid Build Coastguard Worker 6*7c568831SAndroid Build Coastguard Worker#memory debug specific 7*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1) 8*7c568831SAndroid Build Coastguard Worker 9*7c568831SAndroid Build Coastguard Worker# 10*7c568831SAndroid Build Coastguard Worker# A document hosting the nodes returned from the extension function 11*7c568831SAndroid Build Coastguard Worker# 12*7c568831SAndroid Build Coastguard Workermydoc = libxml2.newDoc("1.0") 13*7c568831SAndroid Build Coastguard Worker 14*7c568831SAndroid Build Coastguard Workerdef foo(ctx, str): 15*7c568831SAndroid Build Coastguard Worker global mydoc 16*7c568831SAndroid Build Coastguard Worker 17*7c568831SAndroid Build Coastguard Worker # 18*7c568831SAndroid Build Coastguard Worker # test returning a node set works as expected 19*7c568831SAndroid Build Coastguard Worker # 20*7c568831SAndroid Build Coastguard Worker parent = mydoc.newDocNode(None, 'p', None) 21*7c568831SAndroid Build Coastguard Worker mydoc.addChild(parent) 22*7c568831SAndroid Build Coastguard Worker node = mydoc.newDocText(str) 23*7c568831SAndroid Build Coastguard Worker parent.addChild(node) 24*7c568831SAndroid Build Coastguard Worker return [parent] 25*7c568831SAndroid Build Coastguard Worker 26*7c568831SAndroid Build Coastguard Workerdoc = libxml2.parseFile("tst.xml") 27*7c568831SAndroid Build Coastguard Workerctxt = doc.xpathNewContext() 28*7c568831SAndroid Build Coastguard Workerlibxml2.registerXPathFunction(ctxt._o, "foo", None, foo) 29*7c568831SAndroid Build Coastguard Workerres = ctxt.xpathEval("foo('hello')") 30*7c568831SAndroid Build Coastguard Workerif type(res) != type([]): 31*7c568831SAndroid Build Coastguard Worker print("Failed to return a nodeset") 32*7c568831SAndroid Build Coastguard Worker sys.exit(1) 33*7c568831SAndroid Build Coastguard Workerif len(res) != 1: 34*7c568831SAndroid Build Coastguard Worker print("Unexpected nodeset size") 35*7c568831SAndroid Build Coastguard Worker sys.exit(1) 36*7c568831SAndroid Build Coastguard Workernode = res[0] 37*7c568831SAndroid Build Coastguard Workerif node.name != 'p': 38*7c568831SAndroid Build Coastguard Worker print("Unexpected nodeset element result") 39*7c568831SAndroid Build Coastguard Worker sys.exit(1) 40*7c568831SAndroid Build Coastguard Workernode = node.children 41*7c568831SAndroid Build Coastguard Workerif node.type != 'text': 42*7c568831SAndroid Build Coastguard Worker print("Unexpected nodeset element children type") 43*7c568831SAndroid Build Coastguard Worker sys.exit(1) 44*7c568831SAndroid Build Coastguard Workerif node.content != 'hello': 45*7c568831SAndroid Build Coastguard Worker print("Unexpected nodeset element children content") 46*7c568831SAndroid Build Coastguard Worker sys.exit(1) 47*7c568831SAndroid Build Coastguard Worker 48*7c568831SAndroid Build Coastguard Workerdoc.freeDoc() 49*7c568831SAndroid Build Coastguard Workermydoc.freeDoc() 50*7c568831SAndroid Build Coastguard Workerctxt.xpathFreeContext() 51*7c568831SAndroid Build Coastguard Worker 52*7c568831SAndroid Build Coastguard Worker#memory debug specific 53*7c568831SAndroid Build Coastguard Workerlibxml2.cleanupParser() 54*7c568831SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0: 55*7c568831SAndroid Build Coastguard Worker print("OK") 56*7c568831SAndroid Build Coastguard Workerelse: 57*7c568831SAndroid Build Coastguard Worker print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 58