From 35a201cc8ef0c3f5b2df88d2e528aabee1048348 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Fri, 30 Apr 2021 18:47:09 +0200 Subject: Initial/Final commit --- libxml2-2.9.10/check-xml-test-suite.py | 409 +++++++++++++++++++++++++++++++++ 1 file changed, 409 insertions(+) create mode 100755 libxml2-2.9.10/check-xml-test-suite.py (limited to 'libxml2-2.9.10/check-xml-test-suite.py') diff --git a/libxml2-2.9.10/check-xml-test-suite.py b/libxml2-2.9.10/check-xml-test-suite.py new file mode 100755 index 0000000..399a8db --- /dev/null +++ b/libxml2-2.9.10/check-xml-test-suite.py @@ -0,0 +1,409 @@ +#!/usr/bin/python +import sys +import time +import os +import string +sys.path.insert(0, "python") +import libxml2 + +test_nr = 0 +test_succeed = 0 +test_failed = 0 +test_error = 0 + +# +# the testsuite description +# +CONF="xml-test-suite/xmlconf/xmlconf.xml" +LOG="check-xml-test-suite.log" + +log = open(LOG, "w") + +# +# Error and warning handlers +# +error_nr = 0 +error_msg = '' +def errorHandler(ctx, str): + global error_nr + global error_msg + + 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) + +#warning_nr = 0 +#warning = '' +#def warningHandler(ctx, str): +# global warning_nr +# global warning +# +# warning_nr = warning_nr + 1 +# warning = warning + str +# +#libxml2.registerWarningHandler(warningHandler, None) + +# +# Used to load the XML testsuite description +# +def loadNoentDoc(filename): + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return None + ctxt.replaceEntities(1) + ctxt.parseDocument() + try: + doc = ctxt.doc() + except: + doc = None + if ctxt.wellFormed() != 1: + doc.freeDoc() + return None + return doc + +# +# The conformance testing routines +# + +def testNotWf(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + if doc != None: + doc.freeDoc() + if ret == 0 or ctxt.wellFormed() != 0: + print "%s: error: Well Formedness error not detected" % (id) + log.write("%s: error: Well Formedness error not detected\n" % (id)) + return 0 + return 1 + +def testNotWfEnt(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.replaceEntities(1) + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + if doc != None: + doc.freeDoc() + if ret == 0 or ctxt.wellFormed() != 0: + print "%s: error: Well Formedness error not detected" % (id) + log.write("%s: error: Well Formedness error not detected\n" % (id)) + return 0 + return 1 + +def testNotWfEntDtd(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.replaceEntities(1) + ctxt.loadSubset(1) + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + if doc != None: + doc.freeDoc() + if ret == 0 or ctxt.wellFormed() != 0: + print "%s: error: Well Formedness error not detected" % (id) + log.write("%s: error: Well Formedness error not detected\n" % (id)) + return 0 + return 1 + +def testWfEntDtd(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.replaceEntities(1) + ctxt.loadSubset(1) + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + if doc == None or ret != 0 or ctxt.wellFormed() == 0: + print "%s: error: wrongly failed to parse the document" % (id) + log.write("%s: error: wrongly failed to parse the document\n" % (id)) + if doc != None: + doc.freeDoc() + return 0 + if error_nr != 0: + print "%s: warning: WF document generated an error msg" % (id) + log.write("%s: error: WF document generated an error msg\n" % (id)) + doc.freeDoc() + return 2 + doc.freeDoc() + return 1 + +def testError(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.replaceEntities(1) + ctxt.loadSubset(1) + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + if doc != None: + doc.freeDoc() + if ctxt.wellFormed() == 0: + print "%s: warning: failed to parse the document but accepted" % (id) + log.write("%s: warning: failed to parse the document but accepte\n" % (id)) + return 2 + if error_nr != 0: + print "%s: warning: WF document generated an error msg" % (id) + log.write("%s: error: WF document generated an error msg\n" % (id)) + return 2 + return 1 + +def testInvalid(filename, id): + global error_nr + global error_msg + global log + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.validate(1) + ret = ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + valid = ctxt.isValid() + if doc == None: + print "%s: error: wrongly failed to parse the document" % (id) + log.write("%s: error: wrongly failed to parse the document\n" % (id)) + return 0 + if valid == 1: + print "%s: error: Validity error not detected" % (id) + log.write("%s: error: Validity error not detected\n" % (id)) + doc.freeDoc() + return 0 + if error_nr == 0: + print "%s: warning: Validity error not reported" % (id) + log.write("%s: warning: Validity error not reported\n" % (id)) + doc.freeDoc() + return 2 + + doc.freeDoc() + return 1 + +def testValid(filename, id): + global error_nr + global error_msg + + error_nr = 0 + error_msg = '' + + ctxt = libxml2.createFileParserCtxt(filename) + if ctxt == None: + return -1 + ctxt.validate(1) + ctxt.parseDocument() + + try: + doc = ctxt.doc() + except: + doc = None + valid = ctxt.isValid() + if doc == None: + print "%s: error: wrongly failed to parse the document" % (id) + log.write("%s: error: wrongly failed to parse the document\n" % (id)) + return 0 + if valid != 1: + print "%s: error: Validity check failed" % (id) + log.write("%s: error: Validity check failed\n" % (id)) + doc.freeDoc() + return 0 + if error_nr != 0 or valid != 1: + print "%s: warning: valid document reported an error" % (id) + log.write("%s: warning: valid document reported an error\n" % (id)) + doc.freeDoc() + return 2 + doc.freeDoc() + return 1 + +def runTest(test): + global test_nr + global test_succeed + global test_failed + global error_msg + global log + + uri = test.prop('URI') + id = test.prop('ID') + if uri == None: + print "Test without ID:", uri + return -1 + if id == None: + print "Test without URI:", id + return -1 + base = test.getBase(None) + URI = libxml2.buildURI(uri, base) + if os.access(URI, os.R_OK) == 0: + print "Test %s missing: base %s uri %s" % (URI, base, uri) + return -1 + type = test.prop('TYPE') + if type == None: + print "Test %s missing TYPE" % (id) + return -1 + + extra = None + if type == "invalid": + res = testInvalid(URI, id) + elif type == "valid": + res = testValid(URI, id) + elif type == "not-wf": + extra = test.prop('ENTITIES') + # print URI + #if extra == None: + # res = testNotWfEntDtd(URI, id) + #elif extra == 'none': + # res = testNotWf(URI, id) + #elif extra == 'general': + # res = testNotWfEnt(URI, id) + #elif extra == 'both' or extra == 'parameter': + res = testNotWfEntDtd(URI, id) + #else: + # print "Unknown value %s for an ENTITIES test value" % (extra) + # return -1 + elif type == "error": + res = testError(URI, id) + else: + # TODO skipped for now + return -1 + + test_nr = test_nr + 1 + if res > 0: + test_succeed = test_succeed + 1 + elif res == 0: + test_failed = test_failed + 1 + elif res < 0: + test_error = test_error + 1 + + # Log the ontext + if res != 1: + log.write(" File: %s\n" % (URI)) + content = string.strip(test.content) + while content[-1] == '\n': + content = content[0:-1] + if extra != None: + log.write(" %s:%s:%s\n" % (type, extra, content)) + else: + 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): + profile = case.prop('PROFILE') + if profile != None and \ + string.find(profile, "IBM XML Conformance Test Suite - Production") < 0: + print "=>", profile + test = case.children + while test != None: + if test.name == 'TEST': + runTest(test) + if test.name == 'TESTCASES': + runTestCases(test) + test = test.next + +conf = loadNoentDoc(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) -- cgit v1.2.3