#!/usr/bin/python import sys, libxml2

libxml2.debugMemory(True)

expect=“”“–> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression –> Invalid expression ”“” err=“” def callback(ctx, str):

global err

err = err + "%s %s" % (ctx, str)

libxml2.registerErrorHandler(callback, “–>”)

doc = libxml2.parseDoc(“<fish/>”) ctxt = doc.xpathNewContext() ctxt.setContextNode(doc) badexprs = (

":false()", "bad:()", "bad(:)", ":bad(:)", "bad:(:)", "bad:bad(:)",
"a:/b", "/c:/d", "//e:/f", "g://h"
)

for expr in badexprs:

try:
        ctxt.xpathEval(expr)
except libxml2.xpathError:
        pass
else:
        print("Unexpectedly legal expression:", expr)

ctxt.xpathFreeContext() doc.freeDoc()

if err != expect:

print("error")
print("received %s" %(err))
print("expected %s" %(expect))
sys.exit(1)

libxml2.cleanupParser() leakedbytes = libxml2.debugMemory(True) if leakedbytes == 0:

print("OK")

else:

print("Memory leak", leakedbytes, "bytes")
# drop file to .memdump file in cwd, but won't work if not compiled in
libxml2.dumpMemory()