mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-04-25 22:50:08 +03:00
Add the directory containing libxml2.dll with os.add_dll_directory to make tests work on MinGW. This has changed in Python 3.8 but for some reason, the issue only turned up with Python 3.11 on MinGW. Contrary to documentation, copying libxml2.dll into the directory containing the .pyd file doesn't work.
100 lines
2.2 KiB
Python
Executable File
100 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import string, sys, time
|
|
try:
|
|
from _thread import get_ident
|
|
except:
|
|
from thread import get_ident
|
|
from threading import Thread, Lock
|
|
|
|
import setup_test
|
|
import libxml2
|
|
|
|
THREADS_COUNT = 15
|
|
|
|
failed = 0
|
|
|
|
class ErrorHandler:
|
|
|
|
def __init__(self):
|
|
self.errors = []
|
|
self.lock = Lock()
|
|
|
|
def handler(self,ctx,str):
|
|
self.lock.acquire()
|
|
self.errors.append(str)
|
|
self.lock.release()
|
|
|
|
def getLineNumbersDefault():
|
|
old = libxml2.lineNumbersDefault(0)
|
|
libxml2.lineNumbersDefault(old)
|
|
return old
|
|
|
|
def test(expectedLineNumbersDefault):
|
|
time.sleep(1)
|
|
global failed
|
|
# check a per thread-global
|
|
if expectedLineNumbersDefault != getLineNumbersDefault():
|
|
failed = 1
|
|
print("FAILED to obtain correct value for " \
|
|
"lineNumbersDefault in thread %d" % get_ident())
|
|
# check ther global error handler
|
|
# (which is NOT per-thread in the python bindings)
|
|
try:
|
|
doc = libxml2.parseFile("bad.xml")
|
|
except:
|
|
pass
|
|
else:
|
|
assert "failed"
|
|
|
|
# global error handler
|
|
eh = ErrorHandler()
|
|
libxml2.registerErrorHandler(eh.handler,"")
|
|
|
|
# set on the main thread only
|
|
libxml2.lineNumbersDefault(1)
|
|
test(1)
|
|
ec = len(eh.errors)
|
|
if ec == 0:
|
|
print("FAILED: should have obtained errors")
|
|
sys.exit(1)
|
|
|
|
ts = []
|
|
for i in range(THREADS_COUNT):
|
|
# expect 0 for lineNumbersDefault because
|
|
# the new value has been set on the main thread only
|
|
ts.append(Thread(target=test,args=(0,)))
|
|
for t in ts:
|
|
t.start()
|
|
for t in ts:
|
|
t.join()
|
|
|
|
if len(eh.errors) != ec+THREADS_COUNT*ec:
|
|
print("FAILED: did not obtain the correct number of errors")
|
|
sys.exit(1)
|
|
|
|
# set lineNumbersDefault for future new threads
|
|
libxml2.thrDefLineNumbersDefaultValue(1)
|
|
ts = []
|
|
for i in range(THREADS_COUNT):
|
|
# expect 1 for lineNumbersDefault
|
|
ts.append(Thread(target=test,args=(1,)))
|
|
for t in ts:
|
|
t.start()
|
|
for t in ts:
|
|
t.join()
|
|
|
|
if len(eh.errors) != ec+THREADS_COUNT*ec*2:
|
|
print("FAILED: did not obtain the correct number of errors")
|
|
sys.exit(1)
|
|
|
|
if failed:
|
|
print("FAILED")
|
|
sys.exit(1)
|
|
|
|
# Memory debug specific
|
|
libxml2.cleanupParser()
|
|
if libxml2.debugMemory(1) == 0:
|
|
print("OK")
|
|
else:
|
|
print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
|