38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#!/usr/bin/python -u
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport sys
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport libxml2
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# Memory debug specific
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.debugMemory(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdef foo(ctx, x):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return x + 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdef bar(ctx, x):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return "%d" % (x + 2)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdoc = libxml2.parseFile("tst.xml")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncctxt = doc.xpathNewContext()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncres = ctxt.xpathEval("//*")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif len(res) != 2:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "xpath query: wrong node set size"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif res[0].name != "doc" or res[1].name != "foo":
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "xpath query: wrong node set value"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.registerXPathFunction(ctxt._o, "bar", None, bar)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynci = 10000
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncwhile i > 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = ctxt.xpathEval("foo(1)")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if res != 2:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "xpath extension failure"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync i = i - 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynci = 10000
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncwhile i > 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync res = ctxt.xpathEval("bar(1)")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if res != "3":
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "xpath extension failure got %s expecting '3'"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync i = i - 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdoc.freeDoc()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncctxt.xpathFreeContext()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# Memory debug specific
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.cleanupParser()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif libxml2.debugMemory(1) == 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "OK"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncelse:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "Memory leak %d bytes" % (libxml2.debugMemory(1))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync libxml2.dumpMemory()