File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / check-relaxng-test-suite2.py
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:37:58 2012 UTC (12 years, 3 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, v2_8_0p0, v2_8_0, v2_7_8, HEAD
libxml2

    1: #!/usr/bin/python
    2: import sys
    3: import time
    4: import os
    5: import string
    6: import StringIO
    7: sys.path.insert(0, "python")
    8: import libxml2
    9: 
   10: # Memory debug specific
   11: libxml2.debugMemory(1)
   12: debug = 0
   13: quiet = 1
   14: 
   15: #
   16: # the testsuite description
   17: #
   18: CONF=os.path.join(os.path.dirname(__file__), "test/relaxng/testsuite.xml")
   19: LOG="check-relaxng-test-suite2.log"
   20: 
   21: log = open(LOG, "w")
   22: nb_schemas_tests = 0
   23: nb_schemas_success = 0
   24: nb_schemas_failed = 0
   25: nb_instances_tests = 0
   26: nb_instances_success = 0
   27: nb_instances_failed = 0
   28: 
   29: libxml2.lineNumbersDefault(1)
   30: #
   31: # Resolver callback
   32: #
   33: resources = {}
   34: def resolver(URL, ID, ctxt):
   35:     global resources
   36: 
   37:     if resources.has_key(URL):
   38:         return(StringIO.StringIO(resources[URL]))
   39:     log.write("Resolver failure: asked %s\n" % (URL))
   40:     log.write("resources: %s\n" % (resources))
   41:     return None
   42: 
   43: #
   44: # Load the previous results
   45: #
   46: #results = {}
   47: #previous = {}
   48: #
   49: #try:
   50: #    res = libxml2.parseFile(RES)
   51: #except:
   52: #    log.write("Could not parse %s" % (RES))
   53:     
   54: #
   55: # handle a valid instance
   56: #
   57: def handle_valid(node, schema):
   58:     global log
   59:     global nb_instances_success
   60:     global nb_instances_failed
   61: 
   62:     instance = node.prop("dtd")
   63:     if instance == None:
   64:         instance = ""
   65:     child = node.children
   66:     while child != None:
   67:         if child.type != 'text':
   68: 	    instance = instance + child.serialize()
   69: 	child = child.next
   70: 
   71: #    mem = libxml2.debugMemory(1);
   72:     try:
   73: 	doc = libxml2.parseDoc(instance)
   74:     except:
   75:         doc = None
   76: 
   77:     if doc == None:
   78:         log.write("\nFailed to parse correct instance:\n-----\n")
   79: 	log.write(instance)
   80:         log.write("\n-----\n")
   81: 	nb_instances_failed = nb_instances_failed + 1
   82: 	return
   83: 
   84:     if debug:
   85:         print "instance line %d" % (node.lineNo())
   86:        
   87:     try:
   88:         ctxt = schema.relaxNGNewValidCtxt()
   89: 	ret = doc.relaxNGValidateDoc(ctxt)
   90: 	del ctxt
   91:     except:
   92:         ret = -1
   93: 
   94:     doc.freeDoc()
   95: #    if mem != libxml2.debugMemory(1):
   96: #	print "validating instance %d line %d leaks" % (
   97: #		  nb_instances_tests, node.lineNo())
   98: 
   99:     if ret != 0:
  100:         log.write("\nFailed to validate correct instance:\n-----\n")
  101: 	log.write(instance)
  102:         log.write("\n-----\n")
  103: 	nb_instances_failed = nb_instances_failed + 1
  104:     else:
  105: 	nb_instances_success = nb_instances_success + 1
  106: 
  107: #
  108: # handle an invalid instance
  109: #
  110: def handle_invalid(node, schema):
  111:     global log
  112:     global nb_instances_success
  113:     global nb_instances_failed
  114: 
  115:     instance = node.prop("dtd")
  116:     if instance == None:
  117:         instance = ""
  118:     child = node.children
  119:     while child != None:
  120:         if child.type != 'text':
  121: 	    instance = instance + child.serialize()
  122: 	child = child.next
  123: 
  124: #    mem = libxml2.debugMemory(1);
  125: 
  126:     try:
  127: 	doc = libxml2.parseDoc(instance)
  128:     except:
  129:         doc = None
  130: 
  131:     if doc == None:
  132:         log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
  133: 	log.write(instance)
  134:         log.write("\n-----\n")
  135: 	return
  136: 
  137:     if debug:
  138:         print "instance line %d" % (node.lineNo())
  139:        
  140:     try:
  141:         ctxt = schema.relaxNGNewValidCtxt()
  142: 	ret = doc.relaxNGValidateDoc(ctxt)
  143: 	del ctxt
  144: 
  145:     except:
  146:         ret = -1
  147: 
  148:     doc.freeDoc()
  149: #    mem2 = libxml2.debugMemory(1)
  150: #    if mem != mem2:
  151: #	print "validating instance %d line %d leaks %d bytes" % (
  152: #		  nb_instances_tests, node.lineNo(), mem2 - mem)
  153:     
  154:     if ret == 0:
  155:         log.write("\nFailed to detect validation problem in instance:\n-----\n")
  156: 	log.write(instance)
  157:         log.write("\n-----\n")
  158: 	nb_instances_failed = nb_instances_failed + 1
  159:     else:
  160: 	nb_instances_success = nb_instances_success + 1
  161: 
  162: #
  163: # handle an incorrect test
  164: #
  165: def handle_correct(node):
  166:     global log
  167:     global nb_schemas_success
  168:     global nb_schemas_failed
  169: 
  170:     schema = ""
  171:     child = node.children
  172:     while child != None:
  173:         if child.type != 'text':
  174: 	    schema = schema + child.serialize()
  175: 	child = child.next
  176: 
  177:     try:
  178: 	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  179: 	rngs = rngp.relaxNGParse()
  180:     except:
  181:         rngs = None
  182:     if rngs == None:
  183:         log.write("\nFailed to compile correct schema:\n-----\n")
  184: 	log.write(schema)
  185:         log.write("\n-----\n")
  186: 	nb_schemas_failed = nb_schemas_failed + 1
  187:     else:
  188: 	nb_schemas_success = nb_schemas_success + 1
  189:     return rngs
  190:         
  191: def handle_incorrect(node):
  192:     global log
  193:     global nb_schemas_success
  194:     global nb_schemas_failed
  195: 
  196:     schema = ""
  197:     child = node.children
  198:     while child != None:
  199:         if child.type != 'text':
  200: 	    schema = schema + child.serialize()
  201: 	child = child.next
  202: 
  203:     try:
  204: 	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  205: 	rngs = rngp.relaxNGParse()
  206:     except:
  207:         rngs = None
  208:     if rngs != None:
  209:         log.write("\nFailed to detect schema error in:\n-----\n")
  210: 	log.write(schema)
  211:         log.write("\n-----\n")
  212: 	nb_schemas_failed = nb_schemas_failed + 1
  213:     else:
  214: #	log.write("\nSuccess detecting schema error in:\n-----\n")
  215: #	log.write(schema)
  216: #	log.write("\n-----\n")
  217: 	nb_schemas_success = nb_schemas_success + 1
  218:     return None
  219: 
  220: #
  221: # resource handling: keep a dictionary of URL->string mappings
  222: #
  223: def handle_resource(node, dir):
  224:     global resources
  225: 
  226:     try:
  227: 	name = node.prop('name')
  228:     except:
  229:         name = None
  230: 
  231:     if name == None or name == '':
  232:         log.write("resource has no name")
  233: 	return;
  234:         
  235:     if dir != None:
  236: #        name = libxml2.buildURI(name, dir)
  237:         name = dir + '/' + name
  238: 
  239:     res = ""
  240:     child = node.children
  241:     while child != None:
  242:         if child.type != 'text':
  243: 	    res = res + child.serialize()
  244: 	child = child.next
  245:     resources[name] = res
  246: 
  247: #
  248: # dir handling: pseudo directory resources
  249: #
  250: def handle_dir(node, dir):
  251:     try:
  252: 	name = node.prop('name')
  253:     except:
  254:         name = None
  255: 
  256:     if name == None or name == '':
  257:         log.write("resource has no name")
  258: 	return;
  259:         
  260:     if dir != None:
  261: #        name = libxml2.buildURI(name, dir)
  262:         name = dir + '/' + name
  263: 
  264:     dirs = node.xpathEval('dir')
  265:     for dir in dirs:
  266:         handle_dir(dir, name)
  267:     res = node.xpathEval('resource')
  268:     for r in res:
  269:         handle_resource(r, name)
  270: 
  271: #
  272: # handle a testCase element
  273: #
  274: def handle_testCase(node):
  275:     global nb_schemas_tests
  276:     global nb_instances_tests
  277:     global resources
  278: 
  279:     sections = node.xpathEval('string(section)')
  280:     log.write("\n    ======== test %d line %d section %s ==========\n" % (
  281: 
  282:               nb_schemas_tests, node.lineNo(), sections))
  283:     resources = {}
  284:     if debug:
  285:         print "test %d line %d" % (nb_schemas_tests, node.lineNo())
  286: 
  287:     dirs = node.xpathEval('dir')
  288:     for dir in dirs:
  289:         handle_dir(dir, None)
  290:     res = node.xpathEval('resource')
  291:     for r in res:
  292:         handle_resource(r, None)
  293: 
  294:     tsts = node.xpathEval('incorrect')
  295:     if tsts != []:
  296:         if len(tsts) != 1:
  297: 	    print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
  298: 	schema = handle_incorrect(tsts[0])
  299:     else:
  300:         tsts = node.xpathEval('correct')
  301: 	if tsts != []:
  302: 	    if len(tsts) != 1:
  303: 		print "warning test line %d has more than one <correct> example"% (node.lineNo())
  304: 	    schema = handle_correct(tsts[0])
  305: 	else:
  306: 	    print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())
  307: 
  308:     nb_schemas_tests = nb_schemas_tests + 1;
  309:     
  310:     valids = node.xpathEval('valid')
  311:     invalids = node.xpathEval('invalid')
  312:     nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
  313:     if schema != None:
  314:         for valid in valids:
  315: 	    handle_valid(valid, schema)
  316:         for invalid in invalids:
  317: 	    handle_invalid(invalid, schema)
  318: 
  319: 
  320: #
  321: # handle a testSuite element
  322: #
  323: def handle_testSuite(node, level = 0):
  324:     global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
  325:     global nb_instances_tests, nb_instances_success, nb_instances_failed
  326:     if level >= 1:
  327: 	old_schemas_tests = nb_schemas_tests
  328: 	old_schemas_success = nb_schemas_success
  329: 	old_schemas_failed = nb_schemas_failed
  330: 	old_instances_tests = nb_instances_tests
  331: 	old_instances_success = nb_instances_success
  332: 	old_instances_failed = nb_instances_failed
  333: 
  334:     docs = node.xpathEval('documentation')
  335:     authors = node.xpathEval('author')
  336:     if docs != []:
  337:         msg = ""
  338:         for doc in docs:
  339: 	    msg = msg + doc.content + " "
  340: 	if authors != []:
  341: 	    msg = msg + "written by "
  342: 	    for author in authors:
  343: 	        msg = msg + author.content + " "
  344: 	if quiet == 0:
  345: 	    print msg
  346:     sections = node.xpathEval('section')
  347:     if sections != [] and level <= 0:
  348:         msg = ""
  349:         for section in sections:
  350: 	    msg = msg + section.content + " "
  351: 	if quiet == 0:
  352: 	    print "Tests for section %s" % (msg)
  353:     for test in node.xpathEval('testCase'):
  354:         handle_testCase(test)
  355:     for test in node.xpathEval('testSuite'):
  356:         handle_testSuite(test, level + 1)
  357: 	        
  358: 
  359:     if level >= 1 and sections != []:
  360:         msg = ""
  361:         for section in sections:
  362: 	    msg = msg + section.content + " "
  363:         print "Result of tests for section %s" % (msg)
  364:         if nb_schemas_tests != old_schemas_tests:
  365: 	    print "found %d test schemas: %d success %d failures" % (
  366: 		  nb_schemas_tests - old_schemas_tests,
  367: 		  nb_schemas_success - old_schemas_success,
  368: 		  nb_schemas_failed - old_schemas_failed)
  369: 	if nb_instances_tests != old_instances_tests:
  370: 	    print "found %d test instances: %d success %d failures" % (
  371: 		  nb_instances_tests - old_instances_tests,
  372: 		  nb_instances_success - old_instances_success,
  373: 		  nb_instances_failed - old_instances_failed)
  374: #
  375: # Parse the conf file
  376: #
  377: libxml2.substituteEntitiesDefault(1);
  378: testsuite = libxml2.parseFile(CONF)
  379: 
  380: #
  381: # Error and warnng callbacks
  382: #
  383: def callback(ctx, str):
  384:     global log
  385:     log.write("%s%s" % (ctx, str))
  386: 
  387: libxml2.registerErrorHandler(callback, "")
  388: 
  389: libxml2.setEntityLoader(resolver)
  390: root = testsuite.getRootElement()
  391: if root.name != 'testSuite':
  392:     print "%s doesn't start with a testSuite element, aborting" % (CONF)
  393:     sys.exit(1)
  394: if quiet == 0:
  395:     print "Running Relax NG testsuite"
  396: handle_testSuite(root)
  397: 
  398: if quiet == 0:
  399:     print "\nTOTAL:\n"
  400: if quiet == 0 or nb_schemas_failed != 0:
  401:     print "found %d test schemas: %d success %d failures" % (
  402:       nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
  403: if quiet == 0 or nb_instances_failed != 0:
  404:     print "found %d test instances: %d success %d failures" % (
  405:       nb_instances_tests, nb_instances_success, nb_instances_failed)
  406: 
  407: 
  408: testsuite.freeDoc()
  409: 
  410: # Memory debug specific
  411: libxml2.relaxNGCleanupTypes()
  412: libxml2.cleanupParser()
  413: if libxml2.debugMemory(1) == 0:
  414:     if quiet == 0:
  415: 	print "OK"
  416: else:
  417:     print "Memory leak %d bytes" % (libxml2.debugMemory(1))
  418:     libxml2.dumpMemory()

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>