Blame check-xsddata-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
import StringIO
Packit Service a31ea6
sys.path.insert(0, "python")
Packit Service a31ea6
import libxml2
Packit Service a31ea6
Packit Service a31ea6
# Memory debug specific
Packit Service a31ea6
libxml2.debugMemory(1)
Packit Service a31ea6
debug = 0
Packit Service a31ea6
verbose = 0
Packit Service a31ea6
quiet = 1
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# the testsuite description
Packit Service a31ea6
#
Packit Service a31ea6
CONF=os.path.join(os.path.dirname(__file__), "test/xsdtest/xsdtestsuite.xml")
Packit Service a31ea6
LOG="check-xsddata-test-suite.log"
Packit Service a31ea6
Packit Service a31ea6
log = open(LOG, "w")
Packit Service a31ea6
nb_schemas_tests = 0
Packit Service a31ea6
nb_schemas_success = 0
Packit Service a31ea6
nb_schemas_failed = 0
Packit Service a31ea6
nb_instances_tests = 0
Packit Service a31ea6
nb_instances_success = 0
Packit Service a31ea6
nb_instances_failed = 0
Packit Service a31ea6
Packit Service a31ea6
libxml2.lineNumbersDefault(1)
Packit Service a31ea6
#
Packit Service a31ea6
# Error and warnng callbacks
Packit Service a31ea6
#
Packit Service a31ea6
def callback(ctx, str):
Packit Service a31ea6
    global log
Packit Service a31ea6
    log.write("%s%s" % (ctx, str))
Packit Service a31ea6
Packit Service a31ea6
libxml2.registerErrorHandler(callback, "")
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Resolver callback
Packit Service a31ea6
#
Packit Service a31ea6
resources = {}
Packit Service a31ea6
def resolver(URL, ID, ctxt):
Packit Service a31ea6
    global resources
Packit Service a31ea6
Packit Service a31ea6
    if resources.has_key(URL):
Packit Service a31ea6
        return(StringIO.StringIO(resources[URL]))
Packit Service a31ea6
    log.write("Resolver failure: asked %s\n" % (URL))
Packit Service a31ea6
    log.write("resources: %s\n" % (resources))
Packit Service a31ea6
    return None
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# handle a valid instance
Packit Service a31ea6
#
Packit Service a31ea6
def handle_valid(node, schema):
Packit Service a31ea6
    global log
Packit Service a31ea6
    global nb_instances_success
Packit Service a31ea6
    global nb_instances_failed
Packit Service a31ea6
Packit Service a31ea6
    instance = node.prop("dtd")
Packit Service a31ea6
    if instance == None:
Packit Service a31ea6
        instance = ""
Packit Service a31ea6
    child = node.children
Packit Service a31ea6
    while child != None:
Packit Service a31ea6
        if child.type != 'text':
Packit Service a31ea6
	    instance = instance + child.serialize()
Packit Service a31ea6
	child = child.next
Packit Service a31ea6
Packit Service a31ea6
    mem = libxml2.debugMemory(1);
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = libxml2.parseDoc(instance)
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
Packit Service a31ea6
    if doc == None:
Packit Service a31ea6
        log.write("\nFailed to parse correct instance:\n-----\n")
Packit Service a31ea6
	log.write(instance)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	nb_instances_failed = nb_instances_failed + 1
Packit Service a31ea6
	return
Packit Service a31ea6
Packit Service a31ea6
    if debug:
Packit Service a31ea6
        print "instance line %d" % (node.lineNo())
Packit Service a31ea6
       
Packit Service a31ea6
    try:
Packit Service a31ea6
        ctxt = schema.relaxNGNewValidCtxt()
Packit Service a31ea6
	ret = doc.relaxNGValidateDoc(ctxt)
Packit Service a31ea6
	del ctxt
Packit Service a31ea6
    except:
Packit Service a31ea6
        ret = -1
Packit Service a31ea6
Packit Service a31ea6
    doc.freeDoc()
Packit Service a31ea6
    if mem != libxml2.debugMemory(1):
Packit Service a31ea6
	print "validating instance %d line %d leaks" % (
Packit Service a31ea6
		  nb_instances_tests, node.lineNo())
Packit Service a31ea6
Packit Service a31ea6
    if ret != 0:
Packit Service a31ea6
        log.write("\nFailed to validate correct instance:\n-----\n")
Packit Service a31ea6
	log.write(instance)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	nb_instances_failed = nb_instances_failed + 1
Packit Service a31ea6
    else:
Packit Service a31ea6
	nb_instances_success = nb_instances_success + 1
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# handle an invalid instance
Packit Service a31ea6
#
Packit Service a31ea6
def handle_invalid(node, schema):
Packit Service a31ea6
    global log
Packit Service a31ea6
    global nb_instances_success
Packit Service a31ea6
    global nb_instances_failed
Packit Service a31ea6
Packit Service a31ea6
    instance = node.prop("dtd")
Packit Service a31ea6
    if instance == None:
Packit Service a31ea6
        instance = ""
Packit Service a31ea6
    child = node.children
Packit Service a31ea6
    while child != None:
Packit Service a31ea6
        if child.type != 'text':
Packit Service a31ea6
	    instance = instance + child.serialize()
Packit Service a31ea6
	child = child.next
Packit Service a31ea6
Packit Service a31ea6
#    mem = libxml2.debugMemory(1);
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	doc = libxml2.parseDoc(instance)
Packit Service a31ea6
    except:
Packit Service a31ea6
        doc = None
Packit Service a31ea6
Packit Service a31ea6
    if doc == None:
Packit Service a31ea6
        log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
Packit Service a31ea6
	log.write(instance)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	return
Packit Service a31ea6
Packit Service a31ea6
    if debug:
Packit Service a31ea6
        print "instance line %d" % (node.lineNo())
Packit Service a31ea6
       
Packit Service a31ea6
    try:
Packit Service a31ea6
        ctxt = schema.relaxNGNewValidCtxt()
Packit Service a31ea6
	ret = doc.relaxNGValidateDoc(ctxt)
Packit Service a31ea6
	del ctxt
Packit Service a31ea6
Packit Service a31ea6
    except:
Packit Service a31ea6
        ret = -1
Packit Service a31ea6
Packit Service a31ea6
    doc.freeDoc()
Packit Service a31ea6
#    if mem != libxml2.debugMemory(1):
Packit Service a31ea6
#	print "validating instance %d line %d leaks" % (
Packit Service a31ea6
#		  nb_instances_tests, node.lineNo())
Packit Service a31ea6
    
Packit Service a31ea6
    if ret == 0:
Packit Service a31ea6
        log.write("\nFailed to detect validation problem in instance:\n-----\n")
Packit Service a31ea6
	log.write(instance)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	nb_instances_failed = nb_instances_failed + 1
Packit Service a31ea6
    else:
Packit Service a31ea6
	nb_instances_success = nb_instances_success + 1
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# handle an incorrect test
Packit Service a31ea6
#
Packit Service a31ea6
def handle_correct(node):
Packit Service a31ea6
    global log
Packit Service a31ea6
    global nb_schemas_success
Packit Service a31ea6
    global nb_schemas_failed
Packit Service a31ea6
Packit Service a31ea6
    schema = ""
Packit Service a31ea6
    child = node.children
Packit Service a31ea6
    while child != None:
Packit Service a31ea6
        if child.type != 'text':
Packit Service a31ea6
	    schema = schema + child.serialize()
Packit Service a31ea6
	child = child.next
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
Packit Service a31ea6
	rngs = rngp.relaxNGParse()
Packit Service a31ea6
    except:
Packit Service a31ea6
        rngs = None
Packit Service a31ea6
    if rngs == None:
Packit Service a31ea6
        log.write("\nFailed to compile correct schema:\n-----\n")
Packit Service a31ea6
	log.write(schema)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	nb_schemas_failed = nb_schemas_failed + 1
Packit Service a31ea6
    else:
Packit Service a31ea6
	nb_schemas_success = nb_schemas_success + 1
Packit Service a31ea6
    return rngs
Packit Service a31ea6
        
Packit Service a31ea6
def handle_incorrect(node):
Packit Service a31ea6
    global log
Packit Service a31ea6
    global nb_schemas_success
Packit Service a31ea6
    global nb_schemas_failed
Packit Service a31ea6
Packit Service a31ea6
    schema = ""
Packit Service a31ea6
    child = node.children
Packit Service a31ea6
    while child != None:
Packit Service a31ea6
        if child.type != 'text':
Packit Service a31ea6
	    schema = schema + child.serialize()
Packit Service a31ea6
	child = child.next
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
Packit Service a31ea6
	rngs = rngp.relaxNGParse()
Packit Service a31ea6
    except:
Packit Service a31ea6
        rngs = None
Packit Service a31ea6
    if rngs != None:
Packit Service a31ea6
        log.write("\nFailed to detect schema error in:\n-----\n")
Packit Service a31ea6
	log.write(schema)
Packit Service a31ea6
        log.write("\n-----\n")
Packit Service a31ea6
	nb_schemas_failed = nb_schemas_failed + 1
Packit Service a31ea6
    else:
Packit Service a31ea6
#	log.write("\nSuccess detecting schema error in:\n-----\n")
Packit Service a31ea6
#	log.write(schema)
Packit Service a31ea6
#	log.write("\n-----\n")
Packit Service a31ea6
	nb_schemas_success = nb_schemas_success + 1
Packit Service a31ea6
    return None
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# resource handling: keep a dictionary of URL->string mappings
Packit Service a31ea6
#
Packit Service a31ea6
def handle_resource(node, dir):
Packit Service a31ea6
    global resources
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	name = node.prop('name')
Packit Service a31ea6
    except:
Packit Service a31ea6
        name = None
Packit Service a31ea6
Packit Service a31ea6
    if name == None or name == '':
Packit Service a31ea6
        log.write("resource has no name")
Packit Service a31ea6
	return;
Packit Service a31ea6
        
Packit Service a31ea6
    if dir != None:
Packit Service a31ea6
#        name = libxml2.buildURI(name, dir)
Packit Service a31ea6
        name = dir + '/' + name
Packit Service a31ea6
Packit Service a31ea6
    res = ""
Packit Service a31ea6
    child = node.children
Packit Service a31ea6
    while child != None:
Packit Service a31ea6
        if child.type != 'text':
Packit Service a31ea6
	    res = res + child.serialize()
Packit Service a31ea6
	child = child.next
Packit Service a31ea6
    resources[name] = res
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# dir handling: pseudo directory resources
Packit Service a31ea6
#
Packit Service a31ea6
def handle_dir(node, dir):
Packit Service a31ea6
    try:
Packit Service a31ea6
	name = node.prop('name')
Packit Service a31ea6
    except:
Packit Service a31ea6
        name = None
Packit Service a31ea6
Packit Service a31ea6
    if name == None or name == '':
Packit Service a31ea6
        log.write("resource has no name")
Packit Service a31ea6
	return;
Packit Service a31ea6
        
Packit Service a31ea6
    if dir != None:
Packit Service a31ea6
#        name = libxml2.buildURI(name, dir)
Packit Service a31ea6
        name = dir + '/' + name
Packit Service a31ea6
Packit Service a31ea6
    dirs = node.xpathEval('dir')
Packit Service a31ea6
    for dir in dirs:
Packit Service a31ea6
        handle_dir(dir, name)
Packit Service a31ea6
    res = node.xpathEval('resource')
Packit Service a31ea6
    for r in res:
Packit Service a31ea6
        handle_resource(r, name)
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# handle a testCase element
Packit Service a31ea6
#
Packit Service a31ea6
def handle_testCase(node):
Packit Service a31ea6
    global nb_schemas_tests
Packit Service a31ea6
    global nb_instances_tests
Packit Service a31ea6
    global resources
Packit Service a31ea6
Packit Service a31ea6
    sections = node.xpathEval('string(section)')
Packit Service a31ea6
    log.write("\n    ======== test %d line %d section %s ==========\n" % (
Packit Service a31ea6
Packit Service a31ea6
              nb_schemas_tests, node.lineNo(), sections))
Packit Service a31ea6
    resources = {}
Packit Service a31ea6
    if debug:
Packit Service a31ea6
        print "test %d line %d" % (nb_schemas_tests, node.lineNo())
Packit Service a31ea6
Packit Service a31ea6
    dirs = node.xpathEval('dir')
Packit Service a31ea6
    for dir in dirs:
Packit Service a31ea6
        handle_dir(dir, None)
Packit Service a31ea6
    res = node.xpathEval('resource')
Packit Service a31ea6
    for r in res:
Packit Service a31ea6
        handle_resource(r, None)
Packit Service a31ea6
Packit Service a31ea6
    tsts = node.xpathEval('incorrect')
Packit Service a31ea6
    if tsts != []:
Packit Service a31ea6
        if len(tsts) != 1:
Packit Service a31ea6
	    print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
Packit Service a31ea6
	schema = handle_incorrect(tsts[0])
Packit Service a31ea6
    else:
Packit Service a31ea6
        tsts = node.xpathEval('correct')
Packit Service a31ea6
	if tsts != []:
Packit Service a31ea6
	    if len(tsts) != 1:
Packit Service a31ea6
		print "warning test line %d has more than one <correct> example"% (node.lineNo())
Packit Service a31ea6
	    schema = handle_correct(tsts[0])
Packit Service a31ea6
	else:
Packit Service a31ea6
	    print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())
Packit Service a31ea6
Packit Service a31ea6
    nb_schemas_tests = nb_schemas_tests + 1;
Packit Service a31ea6
    
Packit Service a31ea6
    valids = node.xpathEval('valid')
Packit Service a31ea6
    invalids = node.xpathEval('invalid')
Packit Service a31ea6
    nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
Packit Service a31ea6
    if schema != None:
Packit Service a31ea6
        for valid in valids:
Packit Service a31ea6
	    handle_valid(valid, schema)
Packit Service a31ea6
        for invalid in invalids:
Packit Service a31ea6
	    handle_invalid(invalid, schema)
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# handle a testSuite element
Packit Service a31ea6
#
Packit Service a31ea6
def handle_testSuite(node, level = 0):
Packit Service a31ea6
    global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
Packit Service a31ea6
    global nb_instances_tests, nb_instances_success, nb_instances_failed
Packit Service a31ea6
    if verbose and level >= 0:
Packit Service a31ea6
	old_schemas_tests = nb_schemas_tests
Packit Service a31ea6
	old_schemas_success = nb_schemas_success
Packit Service a31ea6
	old_schemas_failed = nb_schemas_failed
Packit Service a31ea6
	old_instances_tests = nb_instances_tests
Packit Service a31ea6
	old_instances_success = nb_instances_success
Packit Service a31ea6
	old_instances_failed = nb_instances_failed
Packit Service a31ea6
Packit Service a31ea6
    docs = node.xpathEval('documentation')
Packit Service a31ea6
    authors = node.xpathEval('author')
Packit Service a31ea6
    if docs != []:
Packit Service a31ea6
        msg = ""
Packit Service a31ea6
        for doc in docs:
Packit Service a31ea6
	    msg = msg + doc.content + " "
Packit Service a31ea6
	if authors != []:
Packit Service a31ea6
	    msg = msg + "written by "
Packit Service a31ea6
	    for author in authors:
Packit Service a31ea6
	        msg = msg + author.content + " "
Packit Service a31ea6
	if quiet == 0:
Packit Service a31ea6
	    print msg
Packit Service a31ea6
    sections = node.xpathEval('section')
Packit Service a31ea6
    if verbose and sections != [] and level <= 0:
Packit Service a31ea6
        msg = ""
Packit Service a31ea6
        for section in sections:
Packit Service a31ea6
	    msg = msg + section.content + " "
Packit Service a31ea6
	if quiet == 0:
Packit Service a31ea6
	    print "Tests for section %s" % (msg)
Packit Service a31ea6
    for test in node.xpathEval('testCase'):
Packit Service a31ea6
        handle_testCase(test)
Packit Service a31ea6
    for test in node.xpathEval('testSuite'):
Packit Service a31ea6
        handle_testSuite(test, level + 1)
Packit Service a31ea6
	        
Packit Service a31ea6
Packit Service a31ea6
    if verbose and level >= 0 :
Packit Service a31ea6
        if sections != []:
Packit Service a31ea6
	    msg = ""
Packit Service a31ea6
	    for section in sections:
Packit Service a31ea6
		msg = msg + section.content + " "
Packit Service a31ea6
	    print "Result of tests for section %s" % (msg)
Packit Service a31ea6
	elif docs != []:
Packit Service a31ea6
	    msg = ""
Packit Service a31ea6
	    for doc in docs:
Packit Service a31ea6
	        msg = msg + doc.content + " "
Packit Service a31ea6
	    print "Result of tests for %s" % (msg)
Packit Service a31ea6
Packit Service a31ea6
        if nb_schemas_tests != old_schemas_tests:
Packit Service a31ea6
	    print "found %d test schemas: %d success %d failures" % (
Packit Service a31ea6
		  nb_schemas_tests - old_schemas_tests,
Packit Service a31ea6
		  nb_schemas_success - old_schemas_success,
Packit Service a31ea6
		  nb_schemas_failed - old_schemas_failed)
Packit Service a31ea6
	if nb_instances_tests != old_instances_tests:
Packit Service a31ea6
	    print "found %d test instances: %d success %d failures" % (
Packit Service a31ea6
		  nb_instances_tests - old_instances_tests,
Packit Service a31ea6
		  nb_instances_success - old_instances_success,
Packit Service a31ea6
		  nb_instances_failed - old_instances_failed)
Packit Service a31ea6
#
Packit Service a31ea6
# Parse the conf file
Packit Service a31ea6
#
Packit Service a31ea6
libxml2.substituteEntitiesDefault(1);
Packit Service a31ea6
testsuite = libxml2.parseFile(CONF)
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Error and warnng callbacks
Packit Service a31ea6
#
Packit Service a31ea6
def callback(ctx, str):
Packit Service a31ea6
    global log
Packit Service a31ea6
    log.write("%s%s" % (ctx, str))
Packit Service a31ea6
Packit Service a31ea6
libxml2.registerErrorHandler(callback, "")
Packit Service a31ea6
Packit Service a31ea6
libxml2.setEntityLoader(resolver)
Packit Service a31ea6
root = testsuite.getRootElement()
Packit Service a31ea6
if root.name != 'testSuite':
Packit Service a31ea6
    print "%s doesn't start with a testSuite element, aborting" % (CONF)
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
if quiet == 0:
Packit Service a31ea6
    print "Running Relax NG testsuite"
Packit Service a31ea6
handle_testSuite(root)
Packit Service a31ea6
Packit Service a31ea6
if quiet == 0 or nb_schemas_failed != 0:
Packit Service a31ea6
    print "\nTOTAL:\nfound %d test schemas: %d success %d failures" % (
Packit Service a31ea6
      nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
Packit Service a31ea6
if quiet == 0 or nb_instances_failed != 0:
Packit Service a31ea6
    print "found %d test instances: %d success %d failures" % (
Packit Service a31ea6
      nb_instances_tests, nb_instances_success, nb_instances_failed)
Packit Service a31ea6
Packit Service a31ea6
testsuite.freeDoc()
Packit Service a31ea6
Packit Service a31ea6
# Memory debug specific
Packit Service a31ea6
libxml2.relaxNGCleanupTypes()
Packit Service a31ea6
libxml2.cleanupParser()
Packit Service a31ea6
if libxml2.debugMemory(1) == 0:
Packit Service a31ea6
    if quiet == 0:
Packit Service a31ea6
	print "OK"
Packit Service a31ea6
else:
Packit Service a31ea6
    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
Packit Service a31ea6
    libxml2.dumpMemory()