Annotation of embedaddon/libxml2/check-xml-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: sys.path.insert(0, "python")
                      7: import libxml2
                      8: 
                      9: test_nr = 0
                     10: test_succeed = 0
                     11: test_failed = 0
                     12: test_error = 0
                     13: 
                     14: #
                     15: # the testsuite description
                     16: #
                     17: CONF="xml-test-suite/xmlconf/xmlconf.xml"
                     18: LOG="check-xml-test-suite.log"
                     19: 
                     20: log = open(LOG, "w")
                     21: 
                     22: #
                     23: # Error and warning handlers
                     24: #
                     25: error_nr = 0
                     26: error_msg = ''
                     27: def errorHandler(ctx, str):
                     28:     global error_nr
                     29:     global error_msg
                     30: 
                     31:     error_nr = error_nr + 1
                     32:     if len(error_msg) < 300:
                     33:         if len(error_msg) == 0 or error_msg[-1] == '\n':
                     34:            error_msg = error_msg + "   >>" + str
                     35:        else:
                     36:            error_msg = error_msg + str
                     37: 
                     38: libxml2.registerErrorHandler(errorHandler, None)
                     39: 
                     40: #warning_nr = 0
                     41: #warning = ''
                     42: #def warningHandler(ctx, str):
                     43: #    global warning_nr
                     44: #    global warning
                     45: #
                     46: #    warning_nr = warning_nr + 1
                     47: #    warning = warning + str
                     48: #
                     49: #libxml2.registerWarningHandler(warningHandler, None)
                     50: 
                     51: #
                     52: # Used to load the XML testsuite description
                     53: #
                     54: def loadNoentDoc(filename):
                     55:     ctxt = libxml2.createFileParserCtxt(filename)
                     56:     if ctxt == None:
                     57:         return None
                     58:     ctxt.replaceEntities(1)
                     59:     ctxt.parseDocument()
                     60:     try:
                     61:        doc = ctxt.doc()
                     62:     except:
                     63:         doc = None
                     64:     if ctxt.wellFormed() != 1:
                     65:         doc.freeDoc()
                     66:        return None
                     67:     return doc
                     68: 
                     69: #
                     70: # The conformance testing routines
                     71: #
                     72: 
                     73: def testNotWf(filename, id):
                     74:     global error_nr
                     75:     global error_msg
                     76:     global log
                     77: 
                     78:     error_nr = 0
                     79:     error_msg = ''
                     80: 
                     81:     ctxt = libxml2.createFileParserCtxt(filename)
                     82:     if ctxt == None:
                     83:         return -1
                     84:     ret = ctxt.parseDocument()
                     85: 
                     86:     try:
                     87:        doc = ctxt.doc()
                     88:     except:
                     89:         doc = None
                     90:     if doc != None:
                     91:        doc.freeDoc()
                     92:     if ret == 0 or ctxt.wellFormed() != 0:
                     93:         print "%s: error: Well Formedness error not detected" % (id)
                     94:        log.write("%s: error: Well Formedness error not detected\n" % (id))
                     95:        return 0
                     96:     return 1
                     97: 
                     98: def testNotWfEnt(filename, id):
                     99:     global error_nr
                    100:     global error_msg
                    101:     global log
                    102: 
                    103:     error_nr = 0
                    104:     error_msg = ''
                    105: 
                    106:     ctxt = libxml2.createFileParserCtxt(filename)
                    107:     if ctxt == None:
                    108:         return -1
                    109:     ctxt.replaceEntities(1)
                    110:     ret = ctxt.parseDocument()
                    111: 
                    112:     try:
                    113:        doc = ctxt.doc()
                    114:     except:
                    115:         doc = None
                    116:     if doc != None:
                    117:        doc.freeDoc()
                    118:     if ret == 0 or ctxt.wellFormed() != 0:
                    119:         print "%s: error: Well Formedness error not detected" % (id)
                    120:        log.write("%s: error: Well Formedness error not detected\n" % (id))
                    121:        return 0
                    122:     return 1
                    123: 
                    124: def testNotWfEntDtd(filename, id):
                    125:     global error_nr
                    126:     global error_msg
                    127:     global log
                    128: 
                    129:     error_nr = 0
                    130:     error_msg = ''
                    131: 
                    132:     ctxt = libxml2.createFileParserCtxt(filename)
                    133:     if ctxt == None:
                    134:         return -1
                    135:     ctxt.replaceEntities(1)
                    136:     ctxt.loadSubset(1)
                    137:     ret = ctxt.parseDocument()
                    138: 
                    139:     try:
                    140:        doc = ctxt.doc()
                    141:     except:
                    142:         doc = None
                    143:     if doc != None:
                    144:        doc.freeDoc()
                    145:     if ret == 0 or ctxt.wellFormed() != 0:
                    146:         print "%s: error: Well Formedness error not detected" % (id)
                    147:        log.write("%s: error: Well Formedness error not detected\n" % (id))
                    148:        return 0
                    149:     return 1
                    150: 
                    151: def testWfEntDtd(filename, id):
                    152:     global error_nr
                    153:     global error_msg
                    154:     global log
                    155: 
                    156:     error_nr = 0
                    157:     error_msg = ''
                    158: 
                    159:     ctxt = libxml2.createFileParserCtxt(filename)
                    160:     if ctxt == None:
                    161:         return -1
                    162:     ctxt.replaceEntities(1)
                    163:     ctxt.loadSubset(1)
                    164:     ret = ctxt.parseDocument()
                    165: 
                    166:     try:
                    167:        doc = ctxt.doc()
                    168:     except:
                    169:         doc = None
                    170:     if doc == None or ret != 0 or ctxt.wellFormed() == 0:
                    171:         print "%s: error: wrongly failed to parse the document" % (id)
                    172:        log.write("%s: error: wrongly failed to parse the document\n" % (id))
                    173:        if doc != None:
                    174:            doc.freeDoc()
                    175:        return 0
                    176:     if error_nr != 0:
                    177:         print "%s: warning: WF document generated an error msg" % (id)
                    178:        log.write("%s: error: WF document generated an error msg\n" % (id))
                    179:        doc.freeDoc()
                    180:        return 2
                    181:     doc.freeDoc()
                    182:     return 1
                    183: 
                    184: def testError(filename, id):
                    185:     global error_nr
                    186:     global error_msg
                    187:     global log
                    188: 
                    189:     error_nr = 0
                    190:     error_msg = ''
                    191: 
                    192:     ctxt = libxml2.createFileParserCtxt(filename)
                    193:     if ctxt == None:
                    194:         return -1
                    195:     ctxt.replaceEntities(1)
                    196:     ctxt.loadSubset(1)
                    197:     ret = ctxt.parseDocument()
                    198: 
                    199:     try:
                    200:        doc = ctxt.doc()
                    201:     except:
                    202:         doc = None
                    203:     if doc != None:
                    204:        doc.freeDoc()
                    205:     if ctxt.wellFormed() == 0:
                    206:         print "%s: warning: failed to parse the document but accepted" % (id)
                    207:        log.write("%s: warning: failed to parse the document but accepte\n" % (id))
                    208:        return 2
                    209:     if error_nr != 0:
                    210:         print "%s: warning: WF document generated an error msg" % (id)
                    211:        log.write("%s: error: WF document generated an error msg\n" % (id))
                    212:        return 2
                    213:     return 1
                    214: 
                    215: def testInvalid(filename, id):
                    216:     global error_nr
                    217:     global error_msg
                    218:     global log
                    219: 
                    220:     error_nr = 0
                    221:     error_msg = ''
                    222: 
                    223:     ctxt = libxml2.createFileParserCtxt(filename)
                    224:     if ctxt == None:
                    225:         return -1
                    226:     ctxt.validate(1)
                    227:     ret = ctxt.parseDocument()
                    228: 
                    229:     try:
                    230:        doc = ctxt.doc()
                    231:     except:
                    232:         doc = None
                    233:     valid = ctxt.isValid()
                    234:     if doc == None:
                    235:         print "%s: error: wrongly failed to parse the document" % (id)
                    236:        log.write("%s: error: wrongly failed to parse the document\n" % (id))
                    237:        return 0
                    238:     if valid == 1:
                    239:         print "%s: error: Validity error not detected" % (id)
                    240:        log.write("%s: error: Validity error not detected\n" % (id))
                    241:        doc.freeDoc()
                    242:        return 0
                    243:     if error_nr == 0:
                    244:         print "%s: warning: Validity error not reported" % (id)
                    245:        log.write("%s: warning: Validity error not reported\n" % (id))
                    246:        doc.freeDoc()
                    247:        return 2
                    248:         
                    249:     doc.freeDoc()
                    250:     return 1
                    251: 
                    252: def testValid(filename, id):
                    253:     global error_nr
                    254:     global error_msg
                    255: 
                    256:     error_nr = 0
                    257:     error_msg = ''
                    258: 
                    259:     ctxt = libxml2.createFileParserCtxt(filename)
                    260:     if ctxt == None:
                    261:         return -1
                    262:     ctxt.validate(1)
                    263:     ctxt.parseDocument()
                    264: 
                    265:     try:
                    266:        doc = ctxt.doc()
                    267:     except:
                    268:         doc = None
                    269:     valid = ctxt.isValid()
                    270:     if doc == None:
                    271:         print "%s: error: wrongly failed to parse the document" % (id)
                    272:        log.write("%s: error: wrongly failed to parse the document\n" % (id))
                    273:        return 0
                    274:     if valid != 1:
                    275:         print "%s: error: Validity check failed" % (id)
                    276:        log.write("%s: error: Validity check failed\n" % (id))
                    277:        doc.freeDoc()
                    278:        return 0
                    279:     if error_nr != 0 or valid != 1:
                    280:         print "%s: warning: valid document reported an error" % (id)
                    281:        log.write("%s: warning: valid document reported an error\n" % (id))
                    282:        doc.freeDoc()
                    283:        return 2
                    284:     doc.freeDoc()
                    285:     return 1
                    286: 
                    287: def runTest(test):
                    288:     global test_nr
                    289:     global test_succeed
                    290:     global test_failed
                    291:     global error_msg
                    292:     global log
                    293: 
                    294:     uri = test.prop('URI')
                    295:     id = test.prop('ID')
                    296:     if uri == None:
                    297:         print "Test without ID:", uri
                    298:        return -1
                    299:     if id == None:
                    300:         print "Test without URI:", id
                    301:        return -1
                    302:     base = test.getBase(None)
                    303:     URI = libxml2.buildURI(uri, base)
                    304:     if os.access(URI, os.R_OK) == 0:
                    305:         print "Test %s missing: base %s uri %s" % (URI, base, uri)
                    306:        return -1
                    307:     type = test.prop('TYPE')
                    308:     if type == None:
                    309:         print "Test %s missing TYPE" % (id)
                    310:        return -1
                    311: 
                    312:     extra = None
                    313:     if type == "invalid":
                    314:         res = testInvalid(URI, id)
                    315:     elif type == "valid":
                    316:         res = testValid(URI, id)
                    317:     elif type == "not-wf":
                    318:         extra =  test.prop('ENTITIES')
                    319:        # print URI
                    320:        #if extra == None:
                    321:        #    res = testNotWfEntDtd(URI, id)
                    322:        #elif extra == 'none':
                    323:        #    res = testNotWf(URI, id)
                    324:        #elif extra == 'general':
                    325:        #    res = testNotWfEnt(URI, id)
                    326:        #elif extra == 'both' or extra == 'parameter':
                    327:        res = testNotWfEntDtd(URI, id)
                    328:        #else:
                    329:        #    print "Unknow value %s for an ENTITIES test value" % (extra)
                    330:        #    return -1
                    331:     elif type == "error":
                    332:        res = testError(URI, id)
                    333:     else:
                    334:         # TODO skipped for now
                    335:        return -1
                    336: 
                    337:     test_nr = test_nr + 1
                    338:     if res > 0:
                    339:        test_succeed = test_succeed + 1
                    340:     elif res == 0:
                    341:        test_failed = test_failed + 1
                    342:     elif res < 0:
                    343:        test_error = test_error + 1
                    344: 
                    345:     # Log the ontext
                    346:     if res != 1:
                    347:        log.write("   File: %s\n" % (URI))
                    348:        content = string.strip(test.content)
                    349:        while content[-1] == '\n':
                    350:            content = content[0:-1]
                    351:        if extra != None:
                    352:            log.write("   %s:%s:%s\n" % (type, extra, content))
                    353:        else:
                    354:            log.write("   %s:%s\n\n" % (type, content))
                    355:        if error_msg != '':
                    356:            log.write("   ----\n%s   ----\n" % (error_msg))
                    357:            error_msg = ''
                    358:        log.write("\n")
                    359: 
                    360:     return 0
                    361:            
                    362: 
                    363: def runTestCases(case):
                    364:     profile = case.prop('PROFILE')
                    365:     if profile != None and \
                    366:        string.find(profile, "IBM XML Conformance Test Suite - Production") < 0:
                    367:        print "=>", profile
                    368:     test = case.children
                    369:     while test != None:
                    370:         if test.name == 'TEST':
                    371:            runTest(test)
                    372:        if test.name == 'TESTCASES':
                    373:            runTestCases(test)
                    374:         test = test.next
                    375:         
                    376: conf = loadNoentDoc(CONF)
                    377: if conf == None:
                    378:     print "Unable to load %s" % CONF
                    379:     sys.exit(1)
                    380: 
                    381: testsuite = conf.getRootElement()
                    382: if testsuite.name != 'TESTSUITE':
                    383:     print "Expecting TESTSUITE root element: aborting"
                    384:     sys.exit(1)
                    385: 
                    386: profile = testsuite.prop('PROFILE')
                    387: if profile != None:
                    388:     print profile
                    389: 
                    390: start = time.time()
                    391: 
                    392: case = testsuite.children
                    393: while case != None:
                    394:     if case.name == 'TESTCASES':
                    395:        old_test_nr = test_nr
                    396:        old_test_succeed = test_succeed
                    397:        old_test_failed = test_failed
                    398:        old_test_error = test_error
                    399:         runTestCases(case)
                    400:        print "   Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
                    401:               test_nr - old_test_nr, test_succeed - old_test_succeed,
                    402:               test_failed - old_test_failed, test_error - old_test_error)
                    403:     case = case.next
                    404: 
                    405: conf.freeDoc()
                    406: log.close()
                    407: 
                    408: print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
                    409:       test_nr, test_succeed, test_failed, test_error, time.time() - start)

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