File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / check-xsddata-test-suite.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: verbose = 0
   14: quiet = 1
   15: 
   16: #
   17: # the testsuite description
   18: #
   19: CONF=os.path.join(os.path.dirname(__file__), "test/xsdtest/xsdtestsuite.xml")
   20: LOG="check-xsddata-test-suite.log"
   21: 
   22: log = open(LOG, "w")
   23: nb_schemas_tests = 0
   24: nb_schemas_success = 0
   25: nb_schemas_failed = 0
   26: nb_instances_tests = 0
   27: nb_instances_success = 0
   28: nb_instances_failed = 0
   29: 
   30: libxml2.lineNumbersDefault(1)
   31: #
   32: # Error and warnng callbacks
   33: #
   34: def callback(ctx, str):
   35:     global log
   36:     log.write("%s%s" % (ctx, str))
   37: 
   38: libxml2.registerErrorHandler(callback, "")
   39: 
   40: #
   41: # Resolver callback
   42: #
   43: resources = {}
   44: def resolver(URL, ID, ctxt):
   45:     global resources
   46: 
   47:     if resources.has_key(URL):
   48:         return(StringIO.StringIO(resources[URL]))
   49:     log.write("Resolver failure: asked %s\n" % (URL))
   50:     log.write("resources: %s\n" % (resources))
   51:     return None
   52: 
   53: #
   54: # handle a valid instance
   55: #
   56: def handle_valid(node, schema):
   57:     global log
   58:     global nb_instances_success
   59:     global nb_instances_failed
   60: 
   61:     instance = node.prop("dtd")
   62:     if instance == None:
   63:         instance = ""
   64:     child = node.children
   65:     while child != None:
   66:         if child.type != 'text':
   67: 	    instance = instance + child.serialize()
   68: 	child = child.next
   69: 
   70:     mem = libxml2.debugMemory(1);
   71:     try:
   72: 	doc = libxml2.parseDoc(instance)
   73:     except:
   74:         doc = None
   75: 
   76:     if doc == None:
   77:         log.write("\nFailed to parse correct instance:\n-----\n")
   78: 	log.write(instance)
   79:         log.write("\n-----\n")
   80: 	nb_instances_failed = nb_instances_failed + 1
   81: 	return
   82: 
   83:     if debug:
   84:         print "instance line %d" % (node.lineNo())
   85:        
   86:     try:
   87:         ctxt = schema.relaxNGNewValidCtxt()
   88: 	ret = doc.relaxNGValidateDoc(ctxt)
   89: 	del ctxt
   90:     except:
   91:         ret = -1
   92: 
   93:     doc.freeDoc()
   94:     if mem != libxml2.debugMemory(1):
   95: 	print "validating instance %d line %d leaks" % (
   96: 		  nb_instances_tests, node.lineNo())
   97: 
   98:     if ret != 0:
   99:         log.write("\nFailed to validate correct instance:\n-----\n")
  100: 	log.write(instance)
  101:         log.write("\n-----\n")
  102: 	nb_instances_failed = nb_instances_failed + 1
  103:     else:
  104: 	nb_instances_success = nb_instances_success + 1
  105: 
  106: #
  107: # handle an invalid instance
  108: #
  109: def handle_invalid(node, schema):
  110:     global log
  111:     global nb_instances_success
  112:     global nb_instances_failed
  113: 
  114:     instance = node.prop("dtd")
  115:     if instance == None:
  116:         instance = ""
  117:     child = node.children
  118:     while child != None:
  119:         if child.type != 'text':
  120: 	    instance = instance + child.serialize()
  121: 	child = child.next
  122: 
  123: #    mem = libxml2.debugMemory(1);
  124: 
  125:     try:
  126: 	doc = libxml2.parseDoc(instance)
  127:     except:
  128:         doc = None
  129: 
  130:     if doc == None:
  131:         log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
  132: 	log.write(instance)
  133:         log.write("\n-----\n")
  134: 	return
  135: 
  136:     if debug:
  137:         print "instance line %d" % (node.lineNo())
  138:        
  139:     try:
  140:         ctxt = schema.relaxNGNewValidCtxt()
  141: 	ret = doc.relaxNGValidateDoc(ctxt)
  142: 	del ctxt
  143: 
  144:     except:
  145:         ret = -1
  146: 
  147:     doc.freeDoc()
  148: #    if mem != libxml2.debugMemory(1):
  149: #	print "validating instance %d line %d leaks" % (
  150: #		  nb_instances_tests, node.lineNo())
  151:     
  152:     if ret == 0:
  153:         log.write("\nFailed to detect validation problem in instance:\n-----\n")
  154: 	log.write(instance)
  155:         log.write("\n-----\n")
  156: 	nb_instances_failed = nb_instances_failed + 1
  157:     else:
  158: 	nb_instances_success = nb_instances_success + 1
  159: 
  160: #
  161: # handle an incorrect test
  162: #
  163: def handle_correct(node):
  164:     global log
  165:     global nb_schemas_success
  166:     global nb_schemas_failed
  167: 
  168:     schema = ""
  169:     child = node.children
  170:     while child != None:
  171:         if child.type != 'text':
  172: 	    schema = schema + child.serialize()
  173: 	child = child.next
  174: 
  175:     try:
  176: 	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  177: 	rngs = rngp.relaxNGParse()
  178:     except:
  179:         rngs = None
  180:     if rngs == None:
  181:         log.write("\nFailed to compile correct schema:\n-----\n")
  182: 	log.write(schema)
  183:         log.write("\n-----\n")
  184: 	nb_schemas_failed = nb_schemas_failed + 1
  185:     else:
  186: 	nb_schemas_success = nb_schemas_success + 1
  187:     return rngs
  188:         
  189: def handle_incorrect(node):
  190:     global log
  191:     global nb_schemas_success
  192:     global nb_schemas_failed
  193: 
  194:     schema = ""
  195:     child = node.children
  196:     while child != None:
  197:         if child.type != 'text':
  198: 	    schema = schema + child.serialize()
  199: 	child = child.next
  200: 
  201:     try:
  202: 	rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
  203: 	rngs = rngp.relaxNGParse()
  204:     except:
  205:         rngs = None
  206:     if rngs != None:
  207:         log.write("\nFailed to detect schema error in:\n-----\n")
  208: 	log.write(schema)
  209:         log.write("\n-----\n")
  210: 	nb_schemas_failed = nb_schemas_failed + 1
  211:     else:
  212: #	log.write("\nSuccess detecting schema error in:\n-----\n")
  213: #	log.write(schema)
  214: #	log.write("\n-----\n")
  215: 	nb_schemas_success = nb_schemas_success + 1
  216:     return None
  217: 
  218: #
  219: # resource handling: keep a dictionary of URL->string mappings
  220: #
  221: def handle_resource(node, dir):
  222:     global resources
  223: 
  224:     try:
  225: 	name = node.prop('name')
  226:     except:
  227:         name = None
  228: 
  229:     if name == None or name == '':
  230:         log.write("resource has no name")
  231: 	return;
  232:         
  233:     if dir != None:
  234: #        name = libxml2.buildURI(name, dir)
  235:         name = dir + '/' + name
  236: 
  237:     res = ""
  238:     child = node.children
  239:     while child != None:
  240:         if child.type != 'text':
  241: 	    res = res + child.serialize()
  242: 	child = child.next
  243:     resources[name] = res
  244: 
  245: #
  246: # dir handling: pseudo directory resources
  247: #
  248: def handle_dir(node, dir):
  249:     try:
  250: 	name = node.prop('name')
  251:     except:
  252:         name = None
  253: 
  254:     if name == None or name == '':
  255:         log.write("resource has no name")
  256: 	return;
  257:         
  258:     if dir != None:
  259: #        name = libxml2.buildURI(name, dir)
  260:         name = dir + '/' + name
  261: 
  262:     dirs = node.xpathEval('dir')
  263:     for dir in dirs:
  264:         handle_dir(dir, name)
  265:     res = node.xpathEval('resource')
  266:     for r in res:
  267:         handle_resource(r, name)
  268: 
  269: #
  270: # handle a testCase element
  271: #
  272: def handle_testCase(node):
  273:     global nb_schemas_tests
  274:     global nb_instances_tests
  275:     global resources
  276: 
  277:     sections = node.xpathEval('string(section)')
  278:     log.write("\n    ======== test %d line %d section %s ==========\n" % (
  279: 
  280:               nb_schemas_tests, node.lineNo(), sections))
  281:     resources = {}
  282:     if debug:
  283:         print "test %d line %d" % (nb_schemas_tests, node.lineNo())
  284: 
  285:     dirs = node.xpathEval('dir')
  286:     for dir in dirs:
  287:         handle_dir(dir, None)
  288:     res = node.xpathEval('resource')
  289:     for r in res:
  290:         handle_resource(r, None)
  291: 
  292:     tsts = node.xpathEval('incorrect')
  293:     if tsts != []:
  294:         if len(tsts) != 1:
  295: 	    print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
  296: 	schema = handle_incorrect(tsts[0])
  297:     else:
  298:         tsts = node.xpathEval('correct')
  299: 	if tsts != []:
  300: 	    if len(tsts) != 1:
  301: 		print "warning test line %d has more than one <correct> example"% (node.lineNo())
  302: 	    schema = handle_correct(tsts[0])
  303: 	else:
  304: 	    print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())
  305: 
  306:     nb_schemas_tests = nb_schemas_tests + 1;
  307:     
  308:     valids = node.xpathEval('valid')
  309:     invalids = node.xpathEval('invalid')
  310:     nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
  311:     if schema != None:
  312:         for valid in valids:
  313: 	    handle_valid(valid, schema)
  314:         for invalid in invalids:
  315: 	    handle_invalid(invalid, schema)
  316: 
  317: 
  318: #
  319: # handle a testSuite element
  320: #
  321: def 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: #
  382: libxml2.substituteEntitiesDefault(1);
  383: testsuite = libxml2.parseFile(CONF)
  384: 
  385: #
  386: # Error and warnng callbacks
  387: #
  388: def callback(ctx, str):
  389:     global log
  390:     log.write("%s%s" % (ctx, str))
  391: 
  392: libxml2.registerErrorHandler(callback, "")
  393: 
  394: libxml2.setEntityLoader(resolver)
  395: root = testsuite.getRootElement()
  396: if root.name != 'testSuite':
  397:     print "%s doesn't start with a testSuite element, aborting" % (CONF)
  398:     sys.exit(1)
  399: if quiet == 0:
  400:     print "Running Relax NG testsuite"
  401: handle_testSuite(root)
  402: 
  403: if 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)
  406: if 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: 
  410: testsuite.freeDoc()
  411: 
  412: # Memory debug specific
  413: libxml2.relaxNGCleanupTypes()
  414: libxml2.cleanupParser()
  415: if libxml2.debugMemory(1) == 0:
  416:     if quiet == 0:
  417: 	print "OK"
  418: else:
  419:     print "Memory leak %d bytes" % (libxml2.debugMemory(1))
  420:     libxml2.dumpMemory()

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