Annotation of embedaddon/libxml2/check-xsddata-test-suite.py, revision 1.1

1.1     ! misho       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>