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 Workercalled = "" 10*7c568831SAndroid Build Coastguard Worker 11*7c568831SAndroid Build Coastguard Workerdef foo(ctx, x): 12*7c568831SAndroid Build Coastguard Worker global called 13*7c568831SAndroid Build Coastguard Worker 14*7c568831SAndroid Build Coastguard Worker # 15*7c568831SAndroid Build Coastguard Worker # test that access to the XPath evaluation contexts 16*7c568831SAndroid Build Coastguard Worker # 17*7c568831SAndroid Build Coastguard Worker pctxt = libxml2.xpathParserContext(_obj=ctx) 18*7c568831SAndroid Build Coastguard Worker ctxt = pctxt.context() 19*7c568831SAndroid Build Coastguard Worker called = ctxt.function() 20*7c568831SAndroid Build Coastguard Worker return x + 1 21*7c568831SAndroid Build Coastguard Worker 22*7c568831SAndroid Build Coastguard Workerdef bar(ctxt, x): 23*7c568831SAndroid Build Coastguard Worker return "%d" % (x + 2) 24*7c568831SAndroid Build Coastguard Worker 25*7c568831SAndroid Build Coastguard Workerdoc = libxml2.parseFile("tst.xml") 26*7c568831SAndroid Build Coastguard Workerctxt = doc.xpathNewContext() 27*7c568831SAndroid Build Coastguard Workerres = ctxt.xpathEval("//*") 28*7c568831SAndroid Build Coastguard Workerif len(res) != 2: 29*7c568831SAndroid Build Coastguard Worker print("xpath query: wrong node set size") 30*7c568831SAndroid Build Coastguard Worker sys.exit(1) 31*7c568831SAndroid Build Coastguard Workerif res[0].name != "doc" or res[1].name != "foo": 32*7c568831SAndroid Build Coastguard Worker print("xpath query: wrong node set value") 33*7c568831SAndroid Build Coastguard Worker sys.exit(1) 34*7c568831SAndroid Build Coastguard Workerlibxml2.registerXPathFunction(ctxt._o, "foo", None, foo) 35*7c568831SAndroid Build Coastguard Workerlibxml2.registerXPathFunction(ctxt._o, "bar", None, bar) 36*7c568831SAndroid Build Coastguard Workeri = 10000 37*7c568831SAndroid Build Coastguard Workerwhile i > 0: 38*7c568831SAndroid Build Coastguard Worker res = ctxt.xpathEval("foo(1)") 39*7c568831SAndroid Build Coastguard Worker if res != 2: 40*7c568831SAndroid Build Coastguard Worker print("xpath extension failure") 41*7c568831SAndroid Build Coastguard Worker sys.exit(1) 42*7c568831SAndroid Build Coastguard Worker i = i - 1 43*7c568831SAndroid Build Coastguard Workeri = 10000 44*7c568831SAndroid Build Coastguard Workerwhile i > 0: 45*7c568831SAndroid Build Coastguard Worker res = ctxt.xpathEval("bar(1)") 46*7c568831SAndroid Build Coastguard Worker if res != "3": 47*7c568831SAndroid Build Coastguard Worker print("xpath extension failure got %s expecting '3'") 48*7c568831SAndroid Build Coastguard Worker sys.exit(1) 49*7c568831SAndroid Build Coastguard Worker i = i - 1 50*7c568831SAndroid Build Coastguard Workerdoc.freeDoc() 51*7c568831SAndroid Build Coastguard Workerctxt.xpathFreeContext() 52*7c568831SAndroid Build Coastguard Worker 53*7c568831SAndroid Build Coastguard Workerif called != "foo": 54*7c568831SAndroid Build Coastguard Worker print("xpath function: failed to access the context") 55*7c568831SAndroid Build Coastguard Worker print("xpath function: %s" % (called)) 56*7c568831SAndroid Build Coastguard Worker sys.exit(1) 57*7c568831SAndroid Build Coastguard Worker 58*7c568831SAndroid Build Coastguard Worker#memory debug specific 59*7c568831SAndroid Build Coastguard Workerlibxml2.cleanupParser() 60*7c568831SAndroid Build Coastguard Workerif libxml2.debugMemory(1) == 0: 61*7c568831SAndroid Build Coastguard Worker print("OK") 62*7c568831SAndroid Build Coastguard Workerelse: 63*7c568831SAndroid Build Coastguard Worker print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 64