Annotation of embedaddon/libxml2/check-relaxng-test-suite.py, revision 1.1.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>