15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import string
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import StringIO
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sys.path.insert(0, "python")
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import libxml2
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Memory debug specific
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.debugMemory(1)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)debug = 0
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)verbose = 0
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)quiet = 1
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the testsuite description
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CONF=os.path.join(os.path.dirname(__file__), "test/xsdtest/xsdtestsuite.xml")
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LOG="check-xsddata-test-suite.log"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log = open(LOG, "w")
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_schemas_tests = 0
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_schemas_success = 0
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_schemas_failed = 0
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_instances_tests = 0
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_instances_success = 0
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)nb_instances_failed = 0
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.lineNumbersDefault(1)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Error and warnng callbacks
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def callback(ctx, str):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.write("%s%s" % (ctx, str))
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.registerErrorHandler(callback, "")
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Resolver callback
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)resources = {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def resolver(URL, ID, ctxt):
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global resources
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if resources.has_key(URL):
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return(StringIO.StringIO(resources[URL]))
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.write("Resolver failure: asked %s\n" % (URL))
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.write("resources: %s\n" % (resources))
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# handle a valid instance
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_valid(node, schema):
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_success
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_failed
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance = node.prop("dtd")
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if instance == None:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance = ""
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node.children
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while child != None:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if child.type != 'text':
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    instance = instance + child.serialize()
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child.next
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mem = libxml2.debugMemory(1);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = libxml2.parseDoc(instance)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = None
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if doc == None:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nFailed to parse correct instance:\n-----\n")
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(instance)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_instances_failed = nb_instances_failed + 1
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if debug:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print "instance line %d" % (node.lineNo())
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt = schema.relaxNGNewValidCtxt()
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = doc.relaxNGValidateDoc(ctxt)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	del ctxt
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = -1
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc.freeDoc()
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if mem != libxml2.debugMemory(1):
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	print "validating instance %d line %d leaks" % (
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_instances_tests, node.lineNo())
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ret != 0:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nFailed to validate correct instance:\n-----\n")
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(instance)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_instances_failed = nb_instances_failed + 1
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_instances_success = nb_instances_success + 1
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# handle an invalid instance
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_invalid(node, schema):
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_success
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_failed
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance = node.prop("dtd")
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if instance == None:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance = ""
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node.children
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while child != None:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if child.type != 'text':
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    instance = instance + child.serialize()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child.next
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    mem = libxml2.debugMemory(1);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	doc = libxml2.parseDoc(instance)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        doc = None
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if doc == None:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(instance)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if debug:
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print "instance line %d" % (node.lineNo())
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ctxt = schema.relaxNGNewValidCtxt()
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = doc.relaxNGValidateDoc(ctxt)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	del ctxt
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = -1
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    doc.freeDoc()
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    if mem != libxml2.debugMemory(1):
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#	print "validating instance %d line %d leaks" % (
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#		  nb_instances_tests, node.lineNo())
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ret == 0:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nFailed to detect validation problem in instance:\n-----\n")
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(instance)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_instances_failed = nb_instances_failed + 1
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_instances_success = nb_instances_success + 1
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# handle an incorrect test
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_correct(node):
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_success
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_failed
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    schema = ""
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node.children
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while child != None:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if child.type != 'text':
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema = schema + child.serialize()
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child.next
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rngs = rngp.relaxNGParse()
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rngs = None
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if rngs == None:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nFailed to compile correct schema:\n-----\n")
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(schema)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_schemas_failed = nb_schemas_failed + 1
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_schemas_success = nb_schemas_success + 1
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rngs
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_incorrect(node):
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_success
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_failed
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    schema = ""
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node.children
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while child != None:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if child.type != 'text':
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema = schema + child.serialize()
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child.next
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	rngs = rngp.relaxNGParse()
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rngs = None
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if rngs != None:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\nFailed to detect schema error in:\n-----\n")
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	log.write(schema)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("\n-----\n")
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_schemas_failed = nb_schemas_failed + 1
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#	log.write("\nSuccess detecting schema error in:\n-----\n")
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#	log.write(schema)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#	log.write("\n-----\n")
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	nb_schemas_success = nb_schemas_success + 1
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# resource handling: keep a dictionary of URL->string mappings
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_resource(node, dir):
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global resources
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = node.prop('name')
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = None
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if name == None or name == '':
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("resource has no name")
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if dir != None:
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        name = libxml2.buildURI(name, dir)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = dir + '/' + name
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = ""
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child = node.children
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while child != None:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if child.type != 'text':
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    res = res + child.serialize()
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	child = child.next
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resources[name] = res
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# dir handling: pseudo directory resources
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_dir(node, dir):
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	name = node.prop('name')
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = None
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if name == None or name == '':
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        log.write("resource has no name")
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if dir != None:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#        name = libxml2.buildURI(name, dir)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = dir + '/' + name
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dirs = node.xpathEval('dir')
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for dir in dirs:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_dir(dir, name)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = node.xpathEval('resource')
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for r in res:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_resource(r, name)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# handle a testCase element
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_testCase(node):
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_tests
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_tests
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global resources
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sections = node.xpathEval('string(section)')
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.write("\n    ======== test %d line %d section %s ==========\n" % (
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              nb_schemas_tests, node.lineNo(), sections))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resources = {}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if debug:
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print "test %d line %d" % (nb_schemas_tests, node.lineNo())
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dirs = node.xpathEval('dir')
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for dir in dirs:
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_dir(dir, None)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = node.xpathEval('resource')
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for r in res:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_resource(r, None)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tsts = node.xpathEval('incorrect')
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if tsts != []:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if len(tsts) != 1:
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	schema = handle_incorrect(tsts[0])
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tsts = node.xpathEval('correct')
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if tsts != []:
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if len(tsts) != 1:
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		print "warning test line %d has more than one <correct> example"% (node.lineNo())
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    schema = handle_correct(tsts[0])
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else:
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_schemas_tests = nb_schemas_tests + 1;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valids = node.xpathEval('valid')
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalids = node.xpathEval('invalid')
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if schema != None:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for valid in valids:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handle_valid(valid, schema)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for invalid in invalids:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handle_invalid(invalid, schema)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# handle a testSuite element
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def handle_testSuite(node, level = 0):
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global nb_instances_tests, nb_instances_success, nb_instances_failed
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if verbose and level >= 0:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_schemas_tests = nb_schemas_tests
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_schemas_success = nb_schemas_success
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_schemas_failed = nb_schemas_failed
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_instances_tests = nb_instances_tests
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_instances_success = nb_instances_success
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	old_instances_failed = nb_instances_failed
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    docs = node.xpathEval('documentation')
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authors = node.xpathEval('author')
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if docs != []:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        msg = ""
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for doc in docs:
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = msg + doc.content + " "
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if authors != []:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = msg + "written by "
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for author in authors:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        msg = msg + author.content + " "
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if quiet == 0:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print msg
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sections = node.xpathEval('section')
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if verbose and sections != [] and level <= 0:
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        msg = ""
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for section in sections:
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = msg + section.content + " "
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if quiet == 0:
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "Tests for section %s" % (msg)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for test in node.xpathEval('testCase'):
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_testCase(test)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for test in node.xpathEval('testSuite'):
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        handle_testSuite(test, level + 1)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if verbose and level >= 0 :
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if sections != []:
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = ""
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for section in sections:
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		msg = msg + section.content + " "
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "Result of tests for section %s" % (msg)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	elif docs != []:
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    msg = ""
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    for doc in docs:
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        msg = msg + doc.content + " "
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "Result of tests for %s" % (msg)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if nb_schemas_tests != old_schemas_tests:
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "found %d test schemas: %d success %d failures" % (
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_schemas_tests - old_schemas_tests,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_schemas_success - old_schemas_success,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_schemas_failed - old_schemas_failed)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if nb_instances_tests != old_instances_tests:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    print "found %d test instances: %d success %d failures" % (
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_instances_tests - old_instances_tests,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_instances_success - old_instances_success,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  nb_instances_failed - old_instances_failed)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Parse the conf file
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.substituteEntitiesDefault(1);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testsuite = libxml2.parseFile(CONF)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Error and warnng callbacks
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def callback(ctx, str):
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    global log
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log.write("%s%s" % (ctx, str))
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.registerErrorHandler(callback, "")
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.setEntityLoader(resolver)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)root = testsuite.getRootElement()
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if root.name != 'testSuite':
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "%s doesn't start with a testSuite element, aborting" % (CONF)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sys.exit(1)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if quiet == 0:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "Running Relax NG testsuite"
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)handle_testSuite(root)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if quiet == 0 or nb_schemas_failed != 0:
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "\nTOTAL:\nfound %d test schemas: %d success %d failures" % (
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if quiet == 0 or nb_instances_failed != 0:
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "found %d test instances: %d success %d failures" % (
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nb_instances_tests, nb_instances_success, nb_instances_failed)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testsuite.freeDoc()
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Memory debug specific
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.relaxNGCleanupTypes()
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.cleanupParser()
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if libxml2.debugMemory(1) == 0:
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if quiet == 0:
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	print "OK"
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else:
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    libxml2.dumpMemory()
421