|  | #!/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 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) |