xref: /aosp_15_r20/external/libxml2/python/tests/tstxpath.py (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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