Blame python/tests/thread2.py

Packit Service a31ea6
#!/usr/bin/python -u
Packit Service a31ea6
import string, sys, time
Packit Service a31ea6
try:
Packit Service a31ea6
    from _thread import get_ident
Packit Service a31ea6
except:
Packit Service a31ea6
    from thread import get_ident
Packit Service a31ea6
from threading import Thread, Lock
Packit Service a31ea6
Packit Service a31ea6
import libxml2
Packit Service a31ea6
Packit Service a31ea6
THREADS_COUNT = 15
Packit Service a31ea6
Packit Service a31ea6
failed = 0
Packit Service a31ea6
Packit Service a31ea6
class ErrorHandler:
Packit Service a31ea6
Packit Service a31ea6
    def __init__(self):
Packit Service a31ea6
        self.errors = []
Packit Service a31ea6
        self.lock = Lock()
Packit Service a31ea6
Packit Service a31ea6
    def handler(self,ctx,str):
Packit Service a31ea6
        self.lock.acquire()
Packit Service a31ea6
        self.errors.append(str)
Packit Service a31ea6
        self.lock.release()
Packit Service a31ea6
Packit Service a31ea6
def getLineNumbersDefault():
Packit Service a31ea6
    old = libxml2.lineNumbersDefault(0)
Packit Service a31ea6
    libxml2.lineNumbersDefault(old)
Packit Service a31ea6
    return old
Packit Service a31ea6
Packit Service a31ea6
def test(expectedLineNumbersDefault):
Packit Service a31ea6
    time.sleep(1)
Packit Service a31ea6
    global failed
Packit Service a31ea6
    # check a per thread-global
Packit Service a31ea6
    if expectedLineNumbersDefault != getLineNumbersDefault():
Packit Service a31ea6
        failed = 1
Packit Service a31ea6
        print("FAILED to obtain correct value for " \
Packit Service a31ea6
              "lineNumbersDefault in thread %d" % get_ident())
Packit Service a31ea6
    # check ther global error handler 
Packit Service a31ea6
    # (which is NOT per-thread in the python bindings)
Packit Service a31ea6
    try:
Packit Service a31ea6
        doc = libxml2.parseFile("bad.xml")
Packit Service a31ea6
    except:
Packit Service a31ea6
        pass
Packit Service a31ea6
    else:
Packit Service a31ea6
        assert "failed"
Packit Service a31ea6
Packit Service a31ea6
# global error handler
Packit Service a31ea6
eh = ErrorHandler()
Packit Service a31ea6
libxml2.registerErrorHandler(eh.handler,"")
Packit Service a31ea6
Packit Service a31ea6
# set on the main thread only
Packit Service a31ea6
libxml2.lineNumbersDefault(1) 
Packit Service a31ea6
test(1)
Packit Service a31ea6
ec = len(eh.errors)
Packit Service a31ea6
if ec == 0:
Packit Service a31ea6
    print("FAILED: should have obtained errors")
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
ts = []
Packit Service a31ea6
for i in range(THREADS_COUNT):
Packit Service a31ea6
    # expect 0 for lineNumbersDefault because
Packit Service a31ea6
    # the new value has been set on the main thread only
Packit Service a31ea6
    ts.append(Thread(target=test,args=(0,)))
Packit Service a31ea6
for t in ts:
Packit Service a31ea6
    t.start()
Packit Service a31ea6
for t in ts:
Packit Service a31ea6
    t.join()
Packit Service a31ea6
Packit Service a31ea6
if len(eh.errors) != ec+THREADS_COUNT*ec:
Packit Service a31ea6
    print("FAILED: did not obtain the correct number of errors")
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
# set lineNumbersDefault for future new threads
Packit Service a31ea6
libxml2.thrDefLineNumbersDefaultValue(1)
Packit Service a31ea6
ts = []
Packit Service a31ea6
for i in range(THREADS_COUNT):
Packit Service a31ea6
    # expect 1 for lineNumbersDefault
Packit Service a31ea6
    ts.append(Thread(target=test,args=(1,)))
Packit Service a31ea6
for t in ts:
Packit Service a31ea6
    t.start()
Packit Service a31ea6
for t in ts:
Packit Service a31ea6
    t.join()
Packit Service a31ea6
Packit Service a31ea6
if len(eh.errors) != ec+THREADS_COUNT*ec*2:
Packit Service a31ea6
    print("FAILED: did not obtain the correct number of errors")
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
if failed:
Packit Service a31ea6
    print("FAILED")
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
Packit Service a31ea6
# Memory debug specific
Packit Service a31ea6
libxml2.cleanupParser()
Packit Service a31ea6
if libxml2.debugMemory(1) == 0:
Packit Service a31ea6
    print("OK")
Packit Service a31ea6
else:
Packit Service a31ea6
    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
Packit Service a31ea6
    libxml2.dumpMemory()