Daniel Veillard | 781ac8b | 2003-05-15 22:11:36 +0000 | [diff] [blame] | 1 | #!/usr/bin/python -u |
| 2 | import string, sys, time |
| 3 | import thread |
| 4 | from threading import Thread, Lock |
| 5 | |
| 6 | import libxml2 |
| 7 | |
| 8 | THREADS_COUNT = 15 |
| 9 | |
| 10 | failed = 0 |
| 11 | |
| 12 | class ErrorHandler: |
| 13 | |
| 14 | def __init__(self): |
| 15 | self.errors = [] |
| 16 | self.lock = Lock() |
| 17 | |
| 18 | def handler(self,ctx,str): |
| 19 | self.lock.acquire() |
| 20 | self.errors.append(str) |
| 21 | self.lock.release() |
| 22 | |
| 23 | def getLineNumbersDefault(): |
| 24 | old = libxml2.lineNumbersDefault(0) |
| 25 | libxml2.lineNumbersDefault(old) |
| 26 | return old |
| 27 | |
| 28 | def test(expectedLineNumbersDefault): |
| 29 | time.sleep(1) |
| 30 | global failed |
| 31 | # check a per thread-global |
| 32 | if expectedLineNumbersDefault != getLineNumbersDefault(): |
| 33 | failed = 1 |
| 34 | print "FAILED to obtain correct value for " \ |
| 35 | "lineNumbersDefault in thread %d" % thread.get_ident() |
| 36 | # check ther global error handler |
| 37 | # (which is NOT per-thread in the python bindings) |
| 38 | try: |
| 39 | doc = libxml2.parseFile("bad.xml") |
| 40 | except: |
| 41 | pass |
| 42 | else: |
| 43 | assert "failed" |
| 44 | |
| 45 | # global error handler |
| 46 | eh = ErrorHandler() |
| 47 | libxml2.registerErrorHandler(eh.handler,"") |
| 48 | |
| 49 | # set on the main thread only |
| 50 | libxml2.lineNumbersDefault(1) |
| 51 | test(1) |
| 52 | ec = len(eh.errors) |
| 53 | if ec == 0: |
| 54 | print "FAILED: should have obtained errors" |
| 55 | sys.exit(1) |
| 56 | |
| 57 | ts = [] |
| 58 | for i in range(THREADS_COUNT): |
| 59 | # expect 0 for lineNumbersDefault because |
| 60 | # the new value has been set on the main thread only |
| 61 | ts.append(Thread(target=test,args=(0,))) |
| 62 | for t in ts: |
| 63 | t.start() |
| 64 | for t in ts: |
| 65 | t.join() |
| 66 | |
| 67 | if len(eh.errors) != ec+THREADS_COUNT*ec: |
| 68 | print "FAILED: did not obtain the correct number of errors" |
| 69 | sys.exit(1) |
| 70 | |
| 71 | # set lineNumbersDefault for future new threads |
| 72 | libxml2.thrDefLineNumbersDefaultValue(1) |
| 73 | ts = [] |
| 74 | for i in range(THREADS_COUNT): |
| 75 | # expect 1 for lineNumbersDefault |
| 76 | ts.append(Thread(target=test,args=(1,))) |
| 77 | for t in ts: |
| 78 | t.start() |
| 79 | for t in ts: |
| 80 | t.join() |
| 81 | |
| 82 | if len(eh.errors) != ec+THREADS_COUNT*ec*2: |
| 83 | print "FAILED: did not obtain the correct number of errors" |
| 84 | sys.exit(1) |
| 85 | |
| 86 | if failed: |
| 87 | print "FAILED" |
| 88 | sys.exit(1) |
| 89 | |
| 90 | # Memory debug specific |
| 91 | libxml2.cleanupParser() |
| 92 | if libxml2.debugMemory(1) == 0: |
| 93 | print "OK" |
| 94 | else: |
| 95 | print "Memory leak %d bytes" % (libxml2.debugMemory(1)) |
| 96 | libxml2.dumpMemory() |