2022-12-07 00:40:01 +03:00
#!/usr/bin/env python3
2002-02-18 00:26:33 +03:00
import sys
2002-02-19 16:46:09 +03:00
import time
2002-02-18 00:26:33 +03:00
import os
2004-10-03 02:55:49 +04:00
sys . path . insert ( 0 , " python " )
2002-02-18 00:26:33 +03:00
import libxml2
2003-10-12 00:58:06 +04:00
test_nr = 0
test_succeed = 0
test_failed = 0
test_error = 0
2002-02-18 00:26:33 +03:00
#
# the testsuite description
#
CONF = " xml-test-suite/xmlconf/xmlconf.xml "
LOG = " check-xml-test-suite.log "
log = open ( LOG , " w " )
#
# Error and warning handlers
#
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
def errorHandler ( ctx , str ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
2003-10-06 12:19:27 +04:00
error_nr = error_nr + 1
2002-02-18 01:47:37 +03:00
if len ( error_msg ) < 300 :
if len ( error_msg ) == 0 or error_msg [ - 1 ] == ' \n ' :
2022-03-29 16:55:51 +03:00
error_msg = error_msg + " >> " + str
else :
error_msg = error_msg + str
2002-02-18 00:26:33 +03:00
libxml2 . registerErrorHandler ( errorHandler , None )
#warning_nr = 0
#warning = ''
#def warningHandler(ctx, str):
# global warning_nr
# global warning
#
# warning_nr = warning_nr + 1
# warning = warning + str
#
#libxml2.registerWarningHandler(warningHandler, None)
#
# Used to load the XML testsuite description
#
def loadNoentDoc ( filename ) :
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return None
ctxt . replaceEntities ( 1 )
ctxt . parseDocument ( )
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2002-02-18 00:26:33 +03:00
if ctxt . wellFormed ( ) != 1 :
doc . freeDoc ( )
2022-03-29 16:55:51 +03:00
return None
2002-02-18 00:26:33 +03:00
return doc
#
# The conformance testing routines
#
def testNotWf ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 00:26:33 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2003-10-06 12:19:27 +04:00
if doc != None :
2022-03-29 16:55:51 +03:00
doc . freeDoc ( )
2003-10-06 12:19:27 +04:00
if ret == 0 or ctxt . wellFormed ( ) != 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : error: Well Formedness error not detected " % ( id ) )
log . write ( " %s : error: Well Formedness error not detected \n " % ( id ) )
return 0
2002-02-18 00:26:33 +03:00
return 1
def testNotWfEnt ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
ctxt . replaceEntities ( 1 )
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 00:26:33 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2003-10-06 12:19:27 +04:00
if doc != None :
2022-03-29 16:55:51 +03:00
doc . freeDoc ( )
2003-10-06 12:19:27 +04:00
if ret == 0 or ctxt . wellFormed ( ) != 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : error: Well Formedness error not detected " % ( id ) )
log . write ( " %s : error: Well Formedness error not detected \n " % ( id ) )
return 0
2002-02-18 00:26:33 +03:00
return 1
def testNotWfEntDtd ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
ctxt . replaceEntities ( 1 )
ctxt . loadSubset ( 1 )
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 00:26:33 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2003-10-06 12:19:27 +04:00
if doc != None :
2022-03-29 16:55:51 +03:00
doc . freeDoc ( )
2003-10-06 12:19:27 +04:00
if ret == 0 or ctxt . wellFormed ( ) != 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : error: Well Formedness error not detected " % ( id ) )
log . write ( " %s : error: Well Formedness error not detected \n " % ( id ) )
return 0
2002-02-18 00:26:33 +03:00
return 1
def testWfEntDtd ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
ctxt . replaceEntities ( 1 )
ctxt . loadSubset ( 1 )
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 00:26:33 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2022-03-29 16:55:51 +03:00
if doc is None or ret != 0 or ctxt . wellFormed ( ) == 0 :
print ( " %s : error: wrongly failed to parse the document " % ( id ) )
log . write ( " %s : error: wrongly failed to parse the document \n " % ( id ) )
if doc != None :
doc . freeDoc ( )
return 0
2002-02-18 00:26:33 +03:00
if error_nr != 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : warning: WF document generated an error msg " % ( id ) )
log . write ( " %s : error: WF document generated an error msg \n " % ( id ) )
doc . freeDoc ( )
return 2
2002-02-18 00:26:33 +03:00
doc . freeDoc ( )
return 1
2002-02-18 17:32:39 +03:00
def testError ( filename , id ) :
global error_nr
global error_msg
global log
error_nr = 0
error_msg = ' '
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 17:32:39 +03:00
return - 1
ctxt . replaceEntities ( 1 )
ctxt . loadSubset ( 1 )
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 17:32:39 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2003-10-06 12:19:27 +04:00
if doc != None :
2022-03-29 16:55:51 +03:00
doc . freeDoc ( )
2002-02-18 17:32:39 +03:00
if ctxt . wellFormed ( ) == 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : warning: failed to parse the document but accepted " % ( id ) )
log . write ( " %s : warning: failed to parse the document but accepte \n " % ( id ) )
return 2
2002-02-18 17:32:39 +03:00
if error_nr != 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : warning: WF document generated an error msg " % ( id ) )
log . write ( " %s : error: WF document generated an error msg \n " % ( id ) )
return 2
2002-02-18 17:32:39 +03:00
return 1
2002-02-18 00:26:33 +03:00
def testInvalid ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
ctxt . validate ( 1 )
2003-10-06 12:19:27 +04:00
ret = ctxt . parseDocument ( )
2002-02-18 00:26:33 +03:00
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2002-02-18 00:26:33 +03:00
valid = ctxt . isValid ( )
2022-03-29 16:55:51 +03:00
if doc is None :
print ( " %s : error: wrongly failed to parse the document " % ( id ) )
log . write ( " %s : error: wrongly failed to parse the document \n " % ( id ) )
return 0
2002-02-18 00:26:33 +03:00
if valid == 1 :
2022-03-29 16:55:51 +03:00
print ( " %s : error: Validity error not detected " % ( id ) )
log . write ( " %s : error: Validity error not detected \n " % ( id ) )
doc . freeDoc ( )
return 0
2002-02-18 00:26:33 +03:00
if error_nr == 0 :
2022-03-29 16:55:51 +03:00
print ( " %s : warning: Validity error not reported " % ( id ) )
log . write ( " %s : warning: Validity error not reported \n " % ( id ) )
doc . freeDoc ( )
return 2
2002-02-18 00:26:33 +03:00
doc . freeDoc ( )
return 1
def testValid ( filename , id ) :
global error_nr
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
error_nr = 0
2002-02-18 01:47:37 +03:00
error_msg = ' '
2002-02-18 00:26:33 +03:00
ctxt = libxml2 . createFileParserCtxt ( filename )
2022-03-29 16:55:51 +03:00
if ctxt is None :
2002-02-18 00:26:33 +03:00
return - 1
ctxt . validate ( 1 )
ctxt . parseDocument ( )
2002-03-09 13:20:00 +03:00
try :
2022-03-29 16:55:51 +03:00
doc = ctxt . doc ( )
2002-03-09 13:20:00 +03:00
except :
doc = None
2002-02-18 00:26:33 +03:00
valid = ctxt . isValid ( )
2022-03-29 16:55:51 +03:00
if doc is None :
print ( " %s : error: wrongly failed to parse the document " % ( id ) )
log . write ( " %s : error: wrongly failed to parse the document \n " % ( id ) )
return 0
2002-02-18 00:26:33 +03:00
if valid != 1 :
2022-03-29 16:55:51 +03:00
print ( " %s : error: Validity check failed " % ( id ) )
log . write ( " %s : error: Validity check failed \n " % ( id ) )
doc . freeDoc ( )
return 0
2002-02-18 00:26:33 +03:00
if error_nr != 0 or valid != 1 :
2022-03-29 16:55:51 +03:00
print ( " %s : warning: valid document reported an error " % ( id ) )
log . write ( " %s : warning: valid document reported an error \n " % ( id ) )
doc . freeDoc ( )
return 2
2002-02-18 00:26:33 +03:00
doc . freeDoc ( )
return 1
def runTest ( test ) :
global test_nr
global test_succeed
2003-10-12 00:58:06 +04:00
global test_failed
2002-02-18 01:47:37 +03:00
global error_msg
2002-02-18 00:26:33 +03:00
global log
uri = test . prop ( ' URI ' )
id = test . prop ( ' ID ' )
2022-03-29 16:55:51 +03:00
if uri is None :
print ( " Test without ID: " , uri )
return - 1
if id is None :
print ( " Test without URI: " , id )
return - 1
2002-02-18 00:26:33 +03:00
base = test . getBase ( None )
URI = libxml2 . buildURI ( uri , base )
if os . access ( URI , os . R_OK ) == 0 :
2022-03-29 16:55:51 +03:00
print ( " Test %s missing: base %s uri %s " % ( URI , base , uri ) )
return - 1
2002-02-18 00:26:33 +03:00
type = test . prop ( ' TYPE ' )
2022-03-29 16:55:51 +03:00
if type is None :
print ( " Test %s missing TYPE " % ( id ) )
return - 1
2002-02-18 00:26:33 +03:00
extra = None
if type == " invalid " :
res = testInvalid ( URI , id )
elif type == " valid " :
res = testValid ( URI , id )
elif type == " not-wf " :
extra = test . prop ( ' ENTITIES ' )
2022-03-29 16:55:51 +03:00
# print(URI)
#if extra is None:
# res = testNotWfEntDtd(URI, id)
#elif extra == 'none':
# res = testNotWf(URI, id)
#elif extra == 'general':
# res = testNotWfEnt(URI, id)
#elif extra == 'both' or extra == 'parameter':
res = testNotWfEntDtd ( URI , id )
#else:
# print("Unknown value %s for an ENTITIES test value" % (extra))
# return -1
2002-02-18 00:26:33 +03:00
elif type == " error " :
2022-03-29 16:55:51 +03:00
res = testError ( URI , id )
2002-02-18 00:26:33 +03:00
else :
# TODO skipped for now
2022-03-29 16:55:51 +03:00
return - 1
2002-02-18 00:26:33 +03:00
test_nr = test_nr + 1
if res > 0 :
2022-03-29 16:55:51 +03:00
test_succeed = test_succeed + 1
2002-02-18 00:26:33 +03:00
elif res == 0 :
2022-03-29 16:55:51 +03:00
test_failed = test_failed + 1
2002-02-18 00:26:33 +03:00
elif res < 0 :
2022-03-29 16:55:51 +03:00
test_error = test_error + 1
2002-02-18 00:26:33 +03:00
# Log the ontext
if res != 1 :
2022-03-29 16:55:51 +03:00
log . write ( " File: %s \n " % ( URI ) )
content = test . content . strip ( )
while content [ - 1 ] == ' \n ' :
content = content [ 0 : - 1 ]
if extra != None :
log . write ( " %s : %s : %s \n " % ( type , extra , content ) )
else :
log . write ( " %s : %s \n \n " % ( type , content ) )
if error_msg != ' ' :
log . write ( " ---- \n %s ---- \n " % ( error_msg ) )
error_msg = ' '
log . write ( " \n " )
2002-02-18 00:26:33 +03:00
return 0
2022-03-29 16:55:51 +03:00
2002-02-18 00:26:33 +03:00
def runTestCases ( case ) :
profile = case . prop ( ' PROFILE ' )
if profile != None and \
2022-03-29 16:55:51 +03:00
profile . find ( " IBM XML Conformance Test Suite - Production " ) < 0 :
print ( " => " , profile )
2002-02-18 00:26:33 +03:00
test = case . children
while test != None :
if test . name == ' TEST ' :
2022-03-29 16:55:51 +03:00
runTest ( test )
if test . name == ' TESTCASES ' :
runTestCases ( test )
2002-02-18 00:26:33 +03:00
test = test . next
2022-03-29 16:55:51 +03:00
2002-02-18 00:26:33 +03:00
conf = loadNoentDoc ( CONF )
2022-03-29 16:55:51 +03:00
if conf is None :
print ( " Unable to load %s " % CONF )
2002-02-18 00:26:33 +03:00
sys . exit ( 1 )
testsuite = conf . getRootElement ( )
if testsuite . name != ' TESTSUITE ' :
2022-03-29 16:55:51 +03:00
print ( " Expecting TESTSUITE root element: aborting " )
2002-02-18 00:26:33 +03:00
sys . exit ( 1 )
profile = testsuite . prop ( ' PROFILE ' )
if profile != None :
2022-03-29 16:55:51 +03:00
print ( profile )
2002-02-18 00:26:33 +03:00
2002-02-19 16:46:09 +03:00
start = time . time ( )
2002-02-18 00:26:33 +03:00
case = testsuite . children
while case != None :
if case . name == ' TESTCASES ' :
2022-03-29 16:55:51 +03:00
old_test_nr = test_nr
old_test_succeed = test_succeed
old_test_failed = test_failed
old_test_error = test_error
2002-02-18 00:26:33 +03:00
runTestCases ( case )
2022-03-29 16:55:51 +03:00
print ( " Ran %d tests: %d succeeded, %d failed and %d generated an error " % (
test_nr - old_test_nr , test_succeed - old_test_succeed ,
test_failed - old_test_failed , test_error - old_test_error ) )
2002-02-18 00:26:33 +03:00
case = case . next
conf . freeDoc ( )
log . close ( )
2022-03-29 16:55:51 +03:00
print ( " Ran %d tests: %d succeeded, %d failed and %d generated an error in %.2f s. " % (
test_nr , test_succeed , test_failed , test_error , time . time ( ) - start ) )