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