Annotation of embedaddon/libxml2/check-xinclude-test-suite.py, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/python
                      2: import sys
                      3: import time
                      4: import os
                      5: import string
                      6: sys.path.insert(0, "python")
                      7: import libxml2
                      8: 
                      9: #
                     10: # the testsuite description
                     11: #
                     12: DIR="xinclude-test-suite"
                     13: CONF="testdescr.xml"
                     14: LOG="check-xinclude-test-suite.log"
                     15: 
                     16: log = open(LOG, "w")
                     17: 
                     18: os.chdir(DIR)
                     19: 
                     20: test_nr = 0
                     21: test_succeed = 0
                     22: test_failed = 0
                     23: test_error = 0
                     24: #
                     25: # Error and warning handlers
                     26: #
                     27: error_nr = 0
                     28: error_msg = ''
                     29: 
                     30: def errorHandler(ctx, str):
                     31:     global error_nr
                     32:     global error_msg
                     33: 
                     34:     if string.find(str, "error:") >= 0:
                     35:        error_nr = error_nr + 1
                     36:     if len(error_msg) < 300:
                     37:         if len(error_msg) == 0 or error_msg[-1] == '\n':
                     38:            error_msg = error_msg + "   >>" + str
                     39:        else:
                     40:            error_msg = error_msg + str
                     41: 
                     42: libxml2.registerErrorHandler(errorHandler, None)
                     43: 
                     44: def testXInclude(filename, id):
                     45:     global error_nr
                     46:     global error_msg
                     47:     global log
                     48: 
                     49:     error_nr = 0
                     50:     error_msg = ''
                     51: 
                     52:     print "testXInclude(%s, %s)" % (filename, id)
                     53:     return 1
                     54: 
                     55: def runTest(test, basedir):
                     56:     global test_nr
                     57:     global test_failed
                     58:     global test_error
                     59:     global test_succeed
                     60:     global error_msg
                     61:     global log
                     62: 
                     63:     fatal_error = 0
                     64:     uri = test.prop('href')
                     65:     id = test.prop('id')
                     66:     type = test.prop('type')
                     67:     if uri == None:
                     68:         print "Test without ID:", uri
                     69:        return -1
                     70:     if id == None:
                     71:         print "Test without URI:", id
                     72:        return -1
                     73:     if type == None:
                     74:         print "Test without URI:", id
                     75:        return -1
                     76:     if basedir != None:
                     77:        URI = basedir + "/" + uri
                     78:     else:
                     79:         URI = uri
                     80:     if os.access(URI, os.R_OK) == 0:
                     81:         print "Test %s missing: base %s uri %s" % (URI, basedir, uri)
                     82:        return -1
                     83: 
                     84:     expected = None
                     85:     outputfile = None
                     86:     diff = None
                     87:     if type != 'error':
                     88:        output = test.xpathEval('string(output)')
                     89:        if output == 'No output file.':
                     90:            output = None
                     91:        if output == '':
                     92:            output = None
                     93:        if output != None:
                     94:            if basedir != None:
                     95:                output = basedir + "/" + output
                     96:            if os.access(output, os.R_OK) == 0:
                     97:                print "Result for %s missing: %s" % (id, output)
                     98:                output = None
                     99:            else:
                    100:                try:
                    101:                    f = open(output)
                    102:                    expected = f.read()
                    103:                    outputfile = output
                    104:                except:
                    105:                    print "Result for %s unreadable: %s" % (id, output)
                    106: 
                    107:     try:
                    108:         # print "testing %s" % (URI)
                    109:        doc = libxml2.parseFile(URI)
                    110:     except:
                    111:         doc = None
                    112:     if doc != None:
                    113:         res = doc.xincludeProcess()
                    114:        if res >= 0 and expected != None:
                    115:            result = doc.serialize()
                    116:            if result != expected:
                    117:                print "Result for %s differs" % (id)
                    118:                open("xinclude.res", "w").write(result)
                    119:                diff = os.popen("diff %s xinclude.res" % outputfile).read()
                    120: 
                    121:        doc.freeDoc()
                    122:     else:
                    123:         print "Failed to parse %s" % (URI)
                    124:        res = -1
                    125: 
                    126:     
                    127: 
                    128:     test_nr = test_nr + 1
                    129:     if type == 'success':
                    130:        if res > 0:
                    131:            test_succeed = test_succeed + 1
                    132:        elif res == 0:
                    133:            test_failed = test_failed + 1
                    134:            print "Test %s: no substitution done ???" % (id)
                    135:        elif res < 0:
                    136:            test_error = test_error + 1
                    137:            print "Test %s: failed valid XInclude processing" % (id)
                    138:     elif type == 'error':
                    139:        if res > 0:
                    140:            test_error = test_error + 1
                    141:            print "Test %s: failed to detect invalid XInclude processing" % (id)
                    142:        elif res == 0:
                    143:            test_failed = test_failed + 1
                    144:            print "Test %s: Invalid but no substitution done" % (id)
                    145:        elif res < 0:
                    146:            test_succeed = test_succeed + 1
                    147:     elif type == 'optional':
                    148:        if res > 0:
                    149:            test_succeed = test_succeed + 1
                    150:        else:
                    151:            print "Test %s: failed optional test" % (id)
                    152: 
                    153:     # Log the ontext
                    154:     if res != 1:
                    155:        log.write("Test ID %s\n" % (id))
                    156:        log.write("   File: %s\n" % (URI))
                    157:        content = string.strip(test.content)
                    158:        while content[-1] == '\n':
                    159:            content = content[0:-1]
                    160:        log.write("   %s:%s\n\n" % (type, content))
                    161:        if error_msg != '':
                    162:            log.write("   ----\n%s   ----\n" % (error_msg))
                    163:            error_msg = ''
                    164:        log.write("\n")
                    165:     if diff != None:
                    166:         log.write("diff from test %s:\n" %(id))
                    167:        log.write("   -----------\n%s\n   -----------\n" % (diff));
                    168: 
                    169:     return 0
                    170:            
                    171: 
                    172: def runTestCases(case):
                    173:     creator = case.prop('creator')
                    174:     if creator != None:
                    175:        print "=>", creator
                    176:     base = case.getBase(None)
                    177:     basedir = case.prop('basedir')
                    178:     if basedir != None:
                    179:        base = libxml2.buildURI(basedir, base)
                    180:     test = case.children
                    181:     while test != None:
                    182:         if test.name == 'testcase':
                    183:            runTest(test, base)
                    184:        if test.name == 'testcases':
                    185:            runTestCases(test)
                    186:         test = test.next
                    187:         
                    188: conf = libxml2.parseFile(CONF)
                    189: if conf == None:
                    190:     print "Unable to load %s" % CONF
                    191:     sys.exit(1)
                    192: 
                    193: testsuite = conf.getRootElement()
                    194: if testsuite.name != 'testsuite':
                    195:     print "Expecting TESTSUITE root element: aborting"
                    196:     sys.exit(1)
                    197: 
                    198: profile = testsuite.prop('PROFILE')
                    199: if profile != None:
                    200:     print profile
                    201: 
                    202: start = time.time()
                    203: 
                    204: case = testsuite.children
                    205: while case != None:
                    206:     if case.name == 'testcases':
                    207:        old_test_nr = test_nr
                    208:        old_test_succeed = test_succeed
                    209:        old_test_failed = test_failed
                    210:        old_test_error = test_error
                    211:         runTestCases(case)
                    212:        print "   Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
                    213:               test_nr - old_test_nr, test_succeed - old_test_succeed,
                    214:               test_failed - old_test_failed, test_error - old_test_error)
                    215:     case = case.next
                    216: 
                    217: conf.freeDoc()
                    218: log.close()
                    219: 
                    220: print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
                    221:       test_nr, test_succeed, test_failed, test_error, time.time() - start)

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>