| #!/usr/bin/python |
| import sys |
| import time |
| import os |
| import string |
| sys.path.append("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 |
| 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() |
| 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) |
| |
| 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") |
| |
| 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 suceeded, %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 suceeded, %d failed and %d generated an error in %.2f s." % ( |
| test_nr, test_succeed, test_failed, test_error, time.time() - start) |