|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
libxml2.debugMemory(1) |
|
|
|
|
|
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 getPedanticParserDefault(): |
|
|
old = libxml2.pedanticParserDefault(0) |
|
|
libxml2.pedanticParserDefault(old) |
|
|
return old |
|
|
|
|
|
def test(expectedPedanticParserDefault): |
|
|
time.sleep(1) |
|
|
global failed |
|
|
|
|
|
if expectedPedanticParserDefault != getPedanticParserDefault(): |
|
|
failed = 1 |
|
|
print("FAILED to obtain correct value for " \ |
|
|
"pedanticParserDefault in thread %d" % get_ident()) |
|
|
|
|
|
|
|
|
try: |
|
|
doc = libxml2.parseFile("bad.xml") |
|
|
except: |
|
|
pass |
|
|
else: |
|
|
assert "failed" |
|
|
|
|
|
|
|
|
eh = ErrorHandler() |
|
|
libxml2.registerErrorHandler(eh.handler,"") |
|
|
|
|
|
|
|
|
libxml2.pedanticParserDefault(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): |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
libxml2.thrDefPedanticParserDefaultValue(1) |
|
|
ts = [] |
|
|
for i in range(THREADS_COUNT): |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
libxml2.cleanupParser() |
|
|
|
|
|
|
|
|
|
|
|
if libxml2.debugMemory(1) == 0: |
|
|
print("OK") |
|
|
else: |
|
|
print("Memory leak %d bytes" % (libxml2.debugMemory(1))) |
|
|
|