Annotation of embedaddon/libxml2/check-xml-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: 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>