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

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