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