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