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