Blame check-xinclude-test-suite.py

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