File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / check-xml-test-suite.py
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:37:58 2012 UTC (12 years, 3 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, v2_8_0p0, v2_8_0, v2_7_8, HEAD
libxml2

    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>