Skip to content
Snippets Groups Projects
check-xinclude-test-suite.py 5.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python
    
    import sys
    import time
    import os
    
    import libxml2
    
    #
    # the testsuite description
    #
    
    DIR="xinclude-test-suite"
    CONF="testdescr.xml"
    
    LOG="check-xinclude-test-suite.log"
    
    log = open(LOG, "w")
    
    
    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 str.find("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
    
    
        uri = test.prop('href')
        id = test.prop('id')
    
        if uri is None:
            print("Test without ID:", uri)
            return -1
        if id is None:
            print("Test without URI:", id)
            return -1
        if type is None:
            print("Test without URI:", id)
            return -1
    
            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
    
            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))
    
            # 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()
    
            print("Failed to parse %s" % (URI))
            res = -1
    
            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))
    
            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
    
            if res > 0:
                test_succeed = test_succeed + 1
            else:
                print("Test %s: failed optional test" % (id))
    
            log.write("Test ID %s\n" % (id))
            log.write("   File: %s\n" % (URI))
            content = test.content.strip()
            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));
    
    
    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)
    
    conf = libxml2.parseFile(CONF)
    
    if conf is 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
    
            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))
    
    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))