18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#!/usr/bin/python 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtimport sys 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtimport time 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtimport os 58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtimport string 68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtimport StringIO 7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtsys.path.insert(0, "python") 8c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtimport libxml2 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Memory debug specific 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtlibxml2.debugMemory(1) 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdebug = 0 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtverbose = 0 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtquiet = 1 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# the testsuite description 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtCONF=os.path.join(os.path.dirname(__file__), "test/xsdtest/xsdtestsuite.xml") 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtLOG="check-xsddata-test-suite.log" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtlog = open(LOG, "w") 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_schemas_tests = 0 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_schemas_success = 0 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_schemas_failed = 0 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_instances_tests = 0 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_instances_success = 0 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnb_instances_failed = 0 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtlibxml2.lineNumbersDefault(1) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Error and warnng callbacks 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef callback(ctx, str): 35ed003d2a93648e6201272d2fb8212cbc01085928Dmitry Shmidt global log 36ed003d2a93648e6201272d2fb8212cbc01085928Dmitry Shmidt log.write("%s%s" % (ctx, str)) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtlibxml2.registerErrorHandler(callback, "") 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# Resolver callback 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtresources = {} 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef resolver(URL, ID, ctxt): 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global resources 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if resources.has_key(URL): 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return(StringIO.StringIO(resources[URL])) 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("Resolver failure: asked %s\n" % (URL)) 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("resources: %s\n" % (resources)) 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return None 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 53444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt# 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# handle a valid instance 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_valid(node, schema): 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global log 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_instances_success 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_instances_failed 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = node.prop("dtd") 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if instance == None: 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = "" 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = node.children 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while child != None: 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if child.type != 'text': 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = instance + child.serialize() 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = child.next 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mem = libxml2.debugMemory(1); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc = libxml2.parseDoc(instance) 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc = None 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if doc == None: 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nFailed to parse correct instance:\n-----\n") 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(instance) 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_failed = nb_instances_failed + 1 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if debug: 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "instance line %d" % (node.lineNo()) 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctxt = schema.relaxNGNewValidCtxt() 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = doc.relaxNGValidateDoc(ctxt) 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt del ctxt 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -1 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc.freeDoc() 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if mem != libxml2.debugMemory(1): 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "validating instance %d line %d leaks" % ( 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_tests, node.lineNo()) 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ret != 0: 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nFailed to validate correct instance:\n-----\n") 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(instance) 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_failed = nb_instances_failed + 1 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_success = nb_instances_success + 1 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# handle an invalid instance 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_invalid(node, schema): 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global log 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_instances_success 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_instances_failed 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = node.prop("dtd") 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if instance == None: 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = "" 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = node.children 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while child != None: 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if child.type != 'text': 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt instance = instance + child.serialize() 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = child.next 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# mem = libxml2.debugMemory(1); 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc = libxml2.parseDoc(instance) 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc = None 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if doc == None: 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nStrange: failed to parse incorrect instance:\n-----\n") 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(instance) 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if debug: 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "instance line %d" % (node.lineNo()) 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctxt = schema.relaxNGNewValidCtxt() 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = doc.relaxNGValidateDoc(ctxt) 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt del ctxt 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -1 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt doc.freeDoc() 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# if mem != libxml2.debugMemory(1): 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# print "validating instance %d line %d leaks" % ( 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# nb_instances_tests, node.lineNo()) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ret == 0: 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nFailed to detect validation problem in instance:\n-----\n") 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(instance) 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_failed = nb_instances_failed + 1 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_success = nb_instances_success + 1 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# handle an incorrect test 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_correct(node): 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global log 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_schemas_success 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_schemas_failed 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = "" 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = node.children 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while child != None: 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if child.type != 'text': 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = schema + child.serialize() 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = child.next 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rngs = rngp.relaxNGParse() 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rngs = None 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if rngs == None: 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nFailed to compile correct schema:\n-----\n") 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(schema) 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_failed = nb_schemas_failed + 1 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_success = nb_schemas_success + 1 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return rngs 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_incorrect(node): 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global log 19161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt global nb_schemas_success 19261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt global nb_schemas_failed 19361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = "" 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = node.children 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while child != None: 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if child.type != 'text': 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = schema + child.serialize() 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = child.next 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 202444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 203444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt rngs = rngp.relaxNGParse() 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rngs = None 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if rngs != None: 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\nFailed to detect schema error in:\n-----\n") 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write(schema) 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n-----\n") 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_failed = nb_schemas_failed + 1 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 21204f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt# log.write("\nSuccess detecting schema error in:\n-----\n") 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# log.write(schema) 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# log.write("\n-----\n") 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_success = nb_schemas_success + 1 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return None 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# resource handling: keep a dictionary of URL->string mappings 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_resource(node, dir): 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global resources 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 224444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt try: 225444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt name = node.prop('name') 226444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt except: 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name = None 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if name == None or name == '': 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("resource has no name") 231444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt return; 232444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 233444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt if dir != None: 234444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt# name = libxml2.buildURI(name, dir) 235444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt name = dir + '/' + name 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = "" 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = node.children 239444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt while child != None: 240444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt if child.type != 'text': 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = res + child.serialize() 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt child = child.next 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt resources[name] = res 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 24604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt# dir handling: pseudo directory resources 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_dir(node, dir): 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt try: 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name = node.prop('name') 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt except: 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name = None 25304f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if name == None or name == '': 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("resource has no name") 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if dir != None: 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# name = libxml2.buildURI(name, dir) 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt name = dir + '/' + name 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26204f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt dirs = node.xpathEval('dir') 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for dir in dirs: 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt handle_dir(dir, name) 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = node.xpathEval('resource') 26604f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt for r in res: 26704f534e89ed127da4077485376f24debc50d80d5Dmitry Shmidt handle_resource(r, name) 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# handle a testCase element 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt# 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtdef handle_testCase(node): 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_schemas_tests 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global nb_instances_tests 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global resources 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sections = node.xpathEval('string(section)') 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt log.write("\n ======== test %d line %d section %s ==========\n" % ( 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_tests, node.lineNo(), sections)) 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt resources = {} 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if debug: 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "test %d line %d" % (nb_schemas_tests, node.lineNo()) 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt dirs = node.xpathEval('dir') 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for dir in dirs: 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt handle_dir(dir, None) 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = node.xpathEval('resource') 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for r in res: 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt handle_resource(r, None) 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tsts = node.xpathEval('incorrect') 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if tsts != []: 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if len(tsts) != 1: 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "warning test line %d has more than one <incorrect> example" %(node.lineNo()) 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = handle_incorrect(tsts[0]) 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tsts = node.xpathEval('correct') 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if tsts != []: 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if len(tsts) != 1: 30104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt print "warning test line %d has more than one <correct> example"% (node.lineNo()) 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt schema = handle_correct(tsts[0]) 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else: 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo()) 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_schemas_tests = nb_schemas_tests + 1; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt valids = node.xpathEval('valid') 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt invalids = node.xpathEval('invalid') 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt nb_instances_tests = nb_instances_tests + len(valids) + len(invalids) 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if schema != None: 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for valid in valids: 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt handle_valid(valid, schema) 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for invalid in invalids: 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt handle_invalid(invalid, schema) 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 317 318# 319# handle a testSuite element 320# 321def handle_testSuite(node, level = 0): 322 global nb_schemas_tests, nb_schemas_success, nb_schemas_failed 323 global nb_instances_tests, nb_instances_success, nb_instances_failed 324 if verbose and level >= 0: 325 old_schemas_tests = nb_schemas_tests 326 old_schemas_success = nb_schemas_success 327 old_schemas_failed = nb_schemas_failed 328 old_instances_tests = nb_instances_tests 329 old_instances_success = nb_instances_success 330 old_instances_failed = nb_instances_failed 331 332 docs = node.xpathEval('documentation') 333 authors = node.xpathEval('author') 334 if docs != []: 335 msg = "" 336 for doc in docs: 337 msg = msg + doc.content + " " 338 if authors != []: 339 msg = msg + "written by " 340 for author in authors: 341 msg = msg + author.content + " " 342 if quiet == 0: 343 print msg 344 sections = node.xpathEval('section') 345 if verbose and sections != [] and level <= 0: 346 msg = "" 347 for section in sections: 348 msg = msg + section.content + " " 349 if quiet == 0: 350 print "Tests for section %s" % (msg) 351 for test in node.xpathEval('testCase'): 352 handle_testCase(test) 353 for test in node.xpathEval('testSuite'): 354 handle_testSuite(test, level + 1) 355 356 357 if verbose and level >= 0 : 358 if sections != []: 359 msg = "" 360 for section in sections: 361 msg = msg + section.content + " " 362 print "Result of tests for section %s" % (msg) 363 elif docs != []: 364 msg = "" 365 for doc in docs: 366 msg = msg + doc.content + " " 367 print "Result of tests for %s" % (msg) 368 369 if nb_schemas_tests != old_schemas_tests: 370 print "found %d test schemas: %d success %d failures" % ( 371 nb_schemas_tests - old_schemas_tests, 372 nb_schemas_success - old_schemas_success, 373 nb_schemas_failed - old_schemas_failed) 374 if nb_instances_tests != old_instances_tests: 375 print "found %d test instances: %d success %d failures" % ( 376 nb_instances_tests - old_instances_tests, 377 nb_instances_success - old_instances_success, 378 nb_instances_failed - old_instances_failed) 379# 380# Parse the conf file 381# 382libxml2.substituteEntitiesDefault(1); 383testsuite = libxml2.parseFile(CONF) 384 385# 386# Error and warnng callbacks 387# 388def callback(ctx, str): 389 global log 390 log.write("%s%s" % (ctx, str)) 391 392libxml2.registerErrorHandler(callback, "") 393 394libxml2.setEntityLoader(resolver) 395root = testsuite.getRootElement() 396if root.name != 'testSuite': 397 print "%s doesn't start with a testSuite element, aborting" % (CONF) 398 sys.exit(1) 399if quiet == 0: 400 print "Running Relax NG testsuite" 401handle_testSuite(root) 402 403if quiet == 0 or nb_schemas_failed != 0: 404 print "\nTOTAL:\nfound %d test schemas: %d success %d failures" % ( 405 nb_schemas_tests, nb_schemas_success, nb_schemas_failed) 406if quiet == 0 or nb_instances_failed != 0: 407 print "found %d test instances: %d success %d failures" % ( 408 nb_instances_tests, nb_instances_success, nb_instances_failed) 409 410testsuite.freeDoc() 411 412# Memory debug specific 413libxml2.relaxNGCleanupTypes() 414libxml2.cleanupParser() 415if libxml2.debugMemory(1) == 0: 416 if quiet == 0: 417 print "OK" 418else: 419 print "Memory leak %d bytes" % (libxml2.debugMemory(1)) 420 libxml2.dumpMemory() 421