Blame check-xml-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
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
#
Packit Service a31ea6
# the testsuite description
Packit Service a31ea6
#
Packit Service a31ea6
CONF="xml-test-suite/xmlconf/xmlconf.xml"
Packit Service a31ea6
LOG="check-xml-test-suite.log"
Packit Service a31ea6
Packit Service a31ea6
log = open(LOG, "w")
Packit Service a31ea6
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
def errorHandler(ctx, str):
Packit Service a31ea6
    global error_nr
Packit Service a31ea6
    global error_msg
Packit Service a31ea6
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
#warning_nr = 0
Packit Service a31ea6
#warning = ''
Packit Service a31ea6
#def warningHandler(ctx, str):
Packit Service a31ea6
#    global warning_nr
Packit Service a31ea6
#    global warning
Packit Service a31ea6
#
Packit Service a31ea6
#    warning_nr = warning_nr + 1
Packit Service a31ea6
#    warning = warning + str
Packit Service a31ea6
#
Packit Service a31ea6
#libxml2.registerWarningHandler(warningHandler, None)
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Used to load the XML testsuite description
Packit Service a31ea6
#
Packit Service a31ea6
def loadNoentDoc(filename):
Packit Service a31ea6
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return None
Packit Service a31ea6
    ctxt.replaceEntities(1)
Packit Service a31ea6
    ctxt.parseDocument()
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if ctxt.wellFormed() != 1:
Packit Service a31ea6
        doc.freeDoc()
Packit Service a31ea6
	return None
Packit Service a31ea6
    return doc
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# The conformance testing routines
Packit Service a31ea6
#
Packit Service a31ea6
Packit Service a31ea6
def testNotWf(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if doc != None:
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
    if ret == 0 or ctxt.wellFormed() != 0:
Packit Service a31ea6
        print "%s: error: Well Formedness error not detected" % (id)
Packit Service a31ea6
	log.write("%s: error: Well Formedness error not detected\n" % (id))
Packit Service a31ea6
	return 0
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testNotWfEnt(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.replaceEntities(1)
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if doc != None:
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
    if ret == 0 or ctxt.wellFormed() != 0:
Packit Service a31ea6
        print "%s: error: Well Formedness error not detected" % (id)
Packit Service a31ea6
	log.write("%s: error: Well Formedness error not detected\n" % (id))
Packit Service a31ea6
	return 0
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testNotWfEntDtd(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.replaceEntities(1)
Packit Service a31ea6
    ctxt.loadSubset(1)
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if doc != None:
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
    if ret == 0 or ctxt.wellFormed() != 0:
Packit Service a31ea6
        print "%s: error: Well Formedness error not detected" % (id)
Packit Service a31ea6
	log.write("%s: error: Well Formedness error not detected\n" % (id))
Packit Service a31ea6
	return 0
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testWfEntDtd(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.replaceEntities(1)
Packit Service a31ea6
    ctxt.loadSubset(1)
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if doc == None or ret != 0 or ctxt.wellFormed() == 0:
Packit Service a31ea6
        print "%s: error: wrongly failed to parse the document" % (id)
Packit Service a31ea6
	log.write("%s: error: wrongly failed to parse the document\n" % (id))
Packit Service a31ea6
	if doc != None:
Packit Service a31ea6
	    doc.freeDoc()
Packit Service a31ea6
	return 0
Packit Service a31ea6
    if error_nr != 0:
Packit Service a31ea6
        print "%s: warning: WF document generated an error msg" % (id)
Packit Service a31ea6
	log.write("%s: error: WF document generated an error msg\n" % (id))
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
	return 2
Packit Service a31ea6
    doc.freeDoc()
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testError(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.replaceEntities(1)
Packit Service a31ea6
    ctxt.loadSubset(1)
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    if doc != None:
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
    if ctxt.wellFormed() == 0:
Packit Service a31ea6
        print "%s: warning: failed to parse the document but accepted" % (id)
Packit Service a31ea6
	log.write("%s: warning: failed to parse the document but accepte\n" % (id))
Packit Service a31ea6
	return 2
Packit Service a31ea6
    if error_nr != 0:
Packit Service a31ea6
        print "%s: warning: WF document generated an error msg" % (id)
Packit Service a31ea6
	log.write("%s: error: WF document generated an error msg\n" % (id))
Packit Service a31ea6
	return 2
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testInvalid(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
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.validate(1)
Packit Service a31ea6
    ret = ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    valid = ctxt.isValid()
Packit Service a31ea6
    if doc == None:
Packit Service a31ea6
        print "%s: error: wrongly failed to parse the document" % (id)
Packit Service a31ea6
	log.write("%s: error: wrongly failed to parse the document\n" % (id))
Packit Service a31ea6
	return 0
Packit Service a31ea6
    if valid == 1:
Packit Service a31ea6
        print "%s: error: Validity error not detected" % (id)
Packit Service a31ea6
	log.write("%s: error: Validity error not detected\n" % (id))
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
	return 0
Packit Service a31ea6
    if error_nr == 0:
Packit Service a31ea6
        print "%s: warning: Validity error not reported" % (id)
Packit Service a31ea6
	log.write("%s: warning: Validity error not reported\n" % (id))
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
	return 2
Packit Service a31ea6
        
Packit Service a31ea6
    doc.freeDoc()
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def testValid(filename, id):
Packit Service a31ea6
    global error_nr
Packit Service a31ea6
    global error_msg
Packit Service a31ea6
Packit Service a31ea6
    error_nr = 0
Packit Service a31ea6
    error_msg = ''
Packit Service a31ea6
Packit Service a31ea6
    ctxt = libxml2.createFileParserCtxt(filename)
Packit Service a31ea6
    if ctxt == None:
Packit Service a31ea6
        return -1
Packit Service a31ea6
    ctxt.validate(1)
Packit Service a31ea6
    ctxt.parseDocument()
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = ctxt.doc()
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
    valid = ctxt.isValid()
Packit Service a31ea6
    if doc == None:
Packit Service a31ea6
        print "%s: error: wrongly failed to parse the document" % (id)
Packit Service a31ea6
	log.write("%s: error: wrongly failed to parse the document\n" % (id))
Packit Service a31ea6
	return 0
Packit Service a31ea6
    if valid != 1:
Packit Service a31ea6
        print "%s: error: Validity check failed" % (id)
Packit Service a31ea6
	log.write("%s: error: Validity check failed\n" % (id))
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
	return 0
Packit Service a31ea6
    if error_nr != 0 or valid != 1:
Packit Service a31ea6
        print "%s: warning: valid document reported an error" % (id)
Packit Service a31ea6
	log.write("%s: warning: valid document reported an error\n" % (id))
Packit Service a31ea6
	doc.freeDoc()
Packit Service a31ea6
	return 2
Packit Service a31ea6
    doc.freeDoc()
Packit Service a31ea6
    return 1
Packit Service a31ea6
Packit Service a31ea6
def runTest(test):
Packit Service a31ea6
    global test_nr
Packit Service a31ea6
    global test_succeed
Packit Service a31ea6
    global test_failed
Packit Service a31ea6
    global error_msg
Packit Service a31ea6
    global log
Packit Service a31ea6
Packit Service a31ea6
    uri = test.prop('URI')
Packit Service a31ea6
    id = test.prop('ID')
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
    base = test.getBase(None)
Packit Service a31ea6
    URI = libxml2.buildURI(uri, base)
Packit Service a31ea6
    if os.access(URI, os.R_OK) == 0:
Packit Service a31ea6
        print "Test %s missing: base %s uri %s" % (URI, base, uri)
Packit Service a31ea6
	return -1
Packit Service a31ea6
    type = test.prop('TYPE')
Packit Service a31ea6
    if type == None:
Packit Service a31ea6
        print "Test %s missing TYPE" % (id)
Packit Service a31ea6
	return -1
Packit Service a31ea6
Packit Service a31ea6
    extra = None
Packit Service a31ea6
    if type == "invalid":
Packit Service a31ea6
        res = testInvalid(URI, id)
Packit Service a31ea6
    elif type == "valid":
Packit Service a31ea6
        res = testValid(URI, id)
Packit Service a31ea6
    elif type == "not-wf":
Packit Service a31ea6
        extra =  test.prop('ENTITIES')
Packit Service a31ea6
	# print URI
Packit Service a31ea6
	#if extra == None:
Packit Service a31ea6
	#    res = testNotWfEntDtd(URI, id)
Packit Service a31ea6
 	#elif extra == 'none':
Packit Service a31ea6
	#    res = testNotWf(URI, id)
Packit Service a31ea6
	#elif extra == 'general':
Packit Service a31ea6
	#    res = testNotWfEnt(URI, id)
Packit Service a31ea6
	#elif extra == 'both' or extra == 'parameter':
Packit Service a31ea6
	res = testNotWfEntDtd(URI, id)
Packit Service a31ea6
	#else:
Packit Service a31ea6
	#    print "Unknow value %s for an ENTITIES test value" % (extra)
Packit Service a31ea6
	#    return -1
Packit Service a31ea6
    elif type == "error":
Packit Service a31ea6
	res = testError(URI, id)
Packit Service a31ea6
    else:
Packit Service a31ea6
        # TODO skipped for now
Packit Service a31ea6
	return -1
Packit Service a31ea6
Packit Service a31ea6
    test_nr = test_nr + 1
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
    elif res < 0:
Packit Service a31ea6
	test_error = test_error + 1
Packit Service a31ea6
Packit Service a31ea6
    # Log the ontext
Packit Service a31ea6
    if res != 1:
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
	if extra != None:
Packit Service a31ea6
	    log.write("   %s:%s:%s\n" % (type, extra, content))
Packit Service a31ea6
	else:
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
Packit Service a31ea6
    return 0
Packit Service a31ea6
	    
Packit Service a31ea6
Packit Service a31ea6
def runTestCases(case):
Packit Service a31ea6
    profile = case.prop('PROFILE')
Packit Service a31ea6
    if profile != None and \
Packit Service a31ea6
       string.find(profile, "IBM XML Conformance Test Suite - Production") < 0:
Packit Service a31ea6
	print "=>", profile
Packit Service a31ea6
    test = case.children
Packit Service a31ea6
    while test != None:
Packit Service a31ea6
        if test.name == 'TEST':
Packit Service a31ea6
	    runTest(test)
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 = loadNoentDoc(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)