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