15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import string 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sys.path.insert(0, "python") 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import libxml2 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test_nr = 0 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test_succeed = 0 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test_failed = 0 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test_error = 0 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the testsuite description 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CONF="xml-test-suite/xmlconf/xmlconf.xml" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LOG="check-xml-test-suite.log" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log = open(LOG, "w") 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Error and warning handlers 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error_nr = 0 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error_msg = '' 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def errorHandler(ctx, str): 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = error_nr + 1 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if len(error_msg) < 300: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if len(error_msg) == 0 or error_msg[-1] == '\n': 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = error_msg + " >>" + str 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = error_msg + str 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libxml2.registerErrorHandler(errorHandler, None) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#warning_nr = 0 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#warning = '' 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#def warningHandler(ctx, str): 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# global warning_nr 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# global warning 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# warning_nr = warning_nr + 1 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# warning = warning + str 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#libxml2.registerWarningHandler(warningHandler, None) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Used to load the XML testsuite description 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def loadNoentDoc(filename): 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return None 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.replaceEntities(1) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.parseDocument() 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt.wellFormed() != 1: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return None 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return doc 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The conformance testing routines 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testNotWf(filename, id): 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc != None: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ret == 0 or ctxt.wellFormed() != 0: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: Well Formedness error not detected" % (id) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: Well Formedness error not detected\n" % (id)) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testNotWfEnt(filename, id): 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.replaceEntities(1) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc != None: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ret == 0 or ctxt.wellFormed() != 0: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: Well Formedness error not detected" % (id) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: Well Formedness error not detected\n" % (id)) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testNotWfEntDtd(filename, id): 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.replaceEntities(1) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.loadSubset(1) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc != None: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ret == 0 or ctxt.wellFormed() != 0: 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: Well Formedness error not detected" % (id) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: Well Formedness error not detected\n" % (id)) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testWfEntDtd(filename, id): 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.replaceEntities(1) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.loadSubset(1) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc == None or ret != 0 or ctxt.wellFormed() == 0: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: wrongly failed to parse the document" % (id) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: wrongly failed to parse the document\n" % (id)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc != None: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if error_nr != 0: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: warning: WF document generated an error msg" % (id) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: WF document generated an error msg\n" % (id)) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testError(filename, id): 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.replaceEntities(1) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.loadSubset(1) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc != None: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt.wellFormed() == 0: 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: warning: failed to parse the document but accepted" % (id) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: warning: failed to parse the document but accepte\n" % (id)) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if error_nr != 0: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: warning: WF document generated an error msg" % (id) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: WF document generated an error msg\n" % (id)) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testInvalid(filename, id): 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.validate(1) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt.parseDocument() 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid = ctxt.isValid() 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc == None: 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: wrongly failed to parse the document" % (id) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: wrongly failed to parse the document\n" % (id)) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if valid == 1: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: Validity error not detected" % (id) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: Validity error not detected\n" % (id)) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if error_nr == 0: 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: warning: Validity error not reported" % (id) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: warning: Validity error not reported\n" % (id)) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def testValid(filename, id): 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_nr 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_nr = 0 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = libxml2.createFileParserCtxt(filename) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ctxt == None: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.validate(1) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt.parseDocument() 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = ctxt.doc() 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc = None 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid = ctxt.isValid() 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if doc == None: 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: wrongly failed to parse the document" % (id) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: wrongly failed to parse the document\n" % (id)) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if valid != 1: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: error: Validity check failed" % (id) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: error: Validity check failed\n" % (id)) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if error_nr != 0 or valid != 1: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "%s: warning: valid document reported an error" % (id) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("%s: warning: valid document reported an error\n" % (id)) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc.freeDoc() 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def runTest(test): 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global test_nr 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global test_succeed 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global test_failed 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global error_msg 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) global log 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = test.prop('URI') 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = test.prop('ID') 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if uri == None: 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Test without ID:", uri 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if id == None: 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Test without URI:", id 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = test.getBase(None) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = libxml2.buildURI(uri, base) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if os.access(URI, os.R_OK) == 0: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Test %s missing: base %s uri %s" % (URI, base, uri) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = test.prop('TYPE') 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type == None: 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Test %s missing TYPE" % (id) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra = None 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type == "invalid": 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = testInvalid(URI, id) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type == "valid": 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = testValid(URI, id) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type == "not-wf": 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra = test.prop('ENTITIES') 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # print URI 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #if extra == None: 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # res = testNotWfEntDtd(URI, id) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #elif extra == 'none': 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # res = testNotWf(URI, id) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #elif extra == 'general': 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # res = testNotWfEnt(URI, id) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #elif extra == 'both' or extra == 'parameter': 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = testNotWfEntDtd(URI, id) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #else: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # print "Unknow value %s for an ENTITIES test value" % (extra) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # return -1 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type == "error": 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = testError(URI, id) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO skipped for now 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_nr = test_nr + 1 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if res > 0: 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_succeed = test_succeed + 1 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif res == 0: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_failed = test_failed + 1 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif res < 0: 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_error = test_error + 1 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Log the ontext 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if res != 1: 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write(" File: %s\n" % (URI)) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = string.strip(test.content) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while content[-1] == '\n': 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content = content[0:-1] 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if extra != None: 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write(" %s:%s:%s\n" % (type, extra, content)) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write(" %s:%s\n\n" % (type, content)) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if error_msg != '': 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write(" ----\n%s ----\n" % (error_msg)) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = '' 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.write("\n") 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def runTestCases(case): 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile = case.prop('PROFILE') 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if profile != None and \ 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string.find(profile, "IBM XML Conformance Test Suite - Production") < 0: 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "=>", profile 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test = case.children 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while test != None: 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if test.name == 'TEST': 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTest(test) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if test.name == 'TESTCASES': 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTestCases(test) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test = test.next 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)conf = loadNoentDoc(CONF) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if conf == None: 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Unable to load %s" % CONF 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(1) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)testsuite = conf.getRootElement() 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if testsuite.name != 'TESTSUITE': 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print "Expecting TESTSUITE root element: aborting" 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(1) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)profile = testsuite.prop('PROFILE') 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if profile != None: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print profile 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)start = time.time() 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case = testsuite.children 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)while case != None: 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if case.name == 'TESTCASES': 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_test_nr = test_nr 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_test_succeed = test_succeed 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_test_failed = test_failed 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_test_error = test_error 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTestCases(case) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print " Ran %d tests: %d suceeded, %d failed and %d generated an error" % ( 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_nr - old_test_nr, test_succeed - old_test_succeed, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_failed - old_test_failed, test_error - old_test_error) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case = case.next 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)conf.freeDoc() 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log.close() 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % ( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_nr, test_succeed, test_failed, test_error, time.time() - start) 410