Annotation of embedaddon/libxml2/check-relaxng-test-suite2.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: 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>