38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync#!/usr/bin/python -u
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport string, sys, time
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport thread
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfrom threading import Thread, Lock
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncimport libxml2
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncTHREADS_COUNT = 15
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfailed = 0
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncclass ErrorHandler:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync def __init__(self):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync self.errors = []
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync self.lock = Lock()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync def handler(self,ctx,str):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync self.lock.acquire()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync self.errors.append(str)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync self.lock.release()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdef getLineNumbersDefault():
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync old = libxml2.lineNumbersDefault(0)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync libxml2.lineNumbersDefault(old)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync return old
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncdef test(expectedLineNumbersDefault):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync time.sleep(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync global failed
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # check a per thread-global
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync if expectedLineNumbersDefault != getLineNumbersDefault():
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync failed = 1
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "FAILED to obtain correct value for " \
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync "lineNumbersDefault in thread %d" % thread.get_ident()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # check ther global error handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # (which is NOT per-thread in the python bindings)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync try:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync doc = libxml2.parseFile("bad.xml")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync except:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync pass
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync else:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync assert "failed"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# global error handler
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynceh = ErrorHandler()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.registerErrorHandler(eh.handler,"")
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# set on the main thread only
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.lineNumbersDefault(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynctest(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncec = len(eh.errors)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif ec == 0:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "FAILED: should have obtained errors"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncts = []
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor i in range(THREADS_COUNT):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # expect 0 for lineNumbersDefault because
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # the new value has been set on the main thread only
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ts.append(Thread(target=test,args=(0,)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor t in ts:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync t.start()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor t in ts:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync t.join()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif len(eh.errors) != ec+THREADS_COUNT*ec:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "FAILED: did not obtain the correct number of errors"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync# set lineNumbersDefault for future new threads
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsynclibxml2.thrDefLineNumbersDefaultValue(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncts = []
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor i in range(THREADS_COUNT):
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync # expect 1 for lineNumbersDefault
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync ts.append(Thread(target=test,args=(1,)))
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor t in ts:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync t.start()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncfor t in ts:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync t.join()
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif len(eh.errors) != ec+THREADS_COUNT*ec*2:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "FAILED: did not obtain the correct number of errors"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsyncif failed:
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync print "FAILED"
38ae7e4efe803ea78b6499cd05a394db32623e41vboxsync sys.exit(1)
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()