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