#!/usr/bin/python import sys import time import os import string sys.path.insert(0, “python”) import libxml2
# # the testsuite description # DIR=“xinclude-test-suite” CONF=“testdescr.xml” LOG=“check-xinclude-test-suite.log”
log = open(LOG, “w”)
os.chdir(DIR)
test_nr = 0 test_succeed = 0 test_failed = 0 test_error = 0 # # Error and warning handlers # error_nr = 0 error_msg = ''
def errorHandler(ctx, str):
global error_nr global error_msg if string.find(str, "error:") >= 0: error_nr = error_nr + 1 if len(error_msg) < 300: if len(error_msg) == 0 or error_msg[-1] == '\n': error_msg = error_msg + " >>" + str else: error_msg = error_msg + str
libxml2.registerErrorHandler(errorHandler, None)
def testXInclude(filename, id):
global error_nr global error_msg global log error_nr = 0 error_msg = '' print "testXInclude(%s, %s)" % (filename, id) return 1
def runTest(test, basedir):
global test_nr global test_failed global test_error global test_succeed global error_msg global log fatal_error = 0 uri = test.prop('href') id = test.prop('id') type = test.prop('type') if uri == None: print "Test without ID:", uri return -1 if id == None: print "Test without URI:", id return -1 if type == None: print "Test without URI:", id return -1 if basedir != None: URI = basedir + "/" + uri else: URI = uri if os.access(URI, os.R_OK) == 0: print "Test %s missing: base %s uri %s" % (URI, basedir, uri) return -1 expected = None outputfile = None diff = None if type != 'error': output = test.xpathEval('string(output)') if output == 'No output file.': output = None if output == '': output = None if output != None: if basedir != None: output = basedir + "/" + output if os.access(output, os.R_OK) == 0: print "Result for %s missing: %s" % (id, output) output = None else: try: f = open(output) expected = f.read() outputfile = output except: print "Result for %s unreadable: %s" % (id, output) try: # print "testing %s" % (URI) doc = libxml2.parseFile(URI) except: doc = None if doc != None: res = doc.xincludeProcess() if res >= 0 and expected != None: result = doc.serialize() if result != expected: print "Result for %s differs" % (id) open("xinclude.res", "w").write(result) diff = os.popen("diff %s xinclude.res" % outputfile).read() doc.freeDoc() else: print "Failed to parse %s" % (URI) res = -1 test_nr = test_nr + 1 if type == 'success': if res > 0: test_succeed = test_succeed + 1 elif res == 0: test_failed = test_failed + 1 print "Test %s: no substitution done ???" % (id) elif res < 0: test_error = test_error + 1 print "Test %s: failed valid XInclude processing" % (id) elif type == 'error': if res > 0: test_error = test_error + 1 print "Test %s: failed to detect invalid XInclude processing" % (id) elif res == 0: test_failed = test_failed + 1 print "Test %s: Invalid but no substitution done" % (id) elif res < 0: test_succeed = test_succeed + 1 elif type == 'optional': if res > 0: test_succeed = test_succeed + 1 else: print "Test %s: failed optional test" % (id) # Log the ontext if res != 1: log.write("Test ID %s\n" % (id)) log.write(" File: %s\n" % (URI)) content = string.strip(test.content) while content[-1] == '\n': content = content[0:-1] log.write(" %s:%s\n\n" % (type, content)) if error_msg != '': log.write(" ----\n%s ----\n" % (error_msg)) error_msg = '' log.write("\n") if diff != None: log.write("diff from test %s:\n" %(id)) log.write(" -----------\n%s\n -----------\n" % (diff)); return 0
def runTestCases(case):
creator = case.prop('creator') if creator != None: print "=>", creator base = case.getBase(None) basedir = case.prop('basedir') if basedir != None: base = libxml2.buildURI(basedir, base) test = case.children while test != None: if test.name == 'testcase': runTest(test, base) if test.name == 'testcases': runTestCases(test) test = test.next
conf = libxml2.parseFile(CONF) if conf == None:
print "Unable to load %s" % CONF sys.exit(1)
testsuite = conf.getRootElement() if testsuite.name != 'testsuite':
print "Expecting TESTSUITE root element: aborting" sys.exit(1)
profile = testsuite.prop('PROFILE') if profile != None:
print profile
start = time.time()
case = testsuite.children while case != None:
if case.name == 'testcases': old_test_nr = test_nr old_test_succeed = test_succeed old_test_failed = test_failed old_test_error = test_error runTestCases(case) print " Ran %d tests: %d succeeded, %d failed and %d generated an error" % ( test_nr - old_test_nr, test_succeed - old_test_succeed, test_failed - old_test_failed, test_error - old_test_error) case = case.next
conf.freeDoc() log.close()
print “Ran %d tests: %d succeeded, %d failed and %d generated an error in %.2f s.” % (
test_nr, test_succeed, test_failed, test_error, time.time() - start)