mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-28 17:47:00 +03:00
a62b31f43f
* In conda or Gentoo Prefix, we don't want to use the system python and instead rely on PATH lookup.
221 lines
5.8 KiB
Python
Executable File
221 lines
5.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import sys
|
|
import time
|
|
import os
|
|
sys.path.insert(0, "python")
|
|
import libxml2
|
|
|
|
#
|
|
# the testsuite description
|
|
#
|
|
DIR="xinclude-test-suite"
|
|
CONF="testdescr.xml"
|
|
LOG="check-xinclude-test-suite.log"
|
|
|
|
log = open(LOG, "w")
|
|
|
|
os.chdir(DIR)
|
|
|
|
test_nr = 0
|
|
test_succeed = 0
|
|
test_failed = 0
|
|
test_error = 0
|
|
#
|
|
# Error and warning handlers
|
|
#
|
|
error_nr = 0
|
|
error_msg = ''
|
|
|
|
def errorHandler(ctx, str):
|
|
global error_nr
|
|
global error_msg
|
|
|
|
if str.find("error:") >= 0:
|
|
error_nr = error_nr + 1
|
|
if len(error_msg) < 300:
|
|
if len(error_msg) == 0 or error_msg[-1] == '\n':
|
|
error_msg = error_msg + " >>" + str
|
|
else:
|
|
error_msg = error_msg + str
|
|
|
|
libxml2.registerErrorHandler(errorHandler, None)
|
|
|
|
def testXInclude(filename, id):
|
|
global error_nr
|
|
global error_msg
|
|
global log
|
|
|
|
error_nr = 0
|
|
error_msg = ''
|
|
|
|
print("testXInclude(%s, %s)" % (filename, id))
|
|
return 1
|
|
|
|
def runTest(test, basedir):
|
|
global test_nr
|
|
global test_failed
|
|
global test_error
|
|
global test_succeed
|
|
global error_msg
|
|
global log
|
|
|
|
fatal_error = 0
|
|
uri = test.prop('href')
|
|
id = test.prop('id')
|
|
type = test.prop('type')
|
|
if uri is None:
|
|
print("Test without ID:", uri)
|
|
return -1
|
|
if id is None:
|
|
print("Test without URI:", id)
|
|
return -1
|
|
if type is None:
|
|
print("Test without URI:", id)
|
|
return -1
|
|
if basedir != None:
|
|
URI = basedir + "/" + uri
|
|
else:
|
|
URI = uri
|
|
if os.access(URI, os.R_OK) == 0:
|
|
print("Test %s missing: base %s uri %s" % (URI, basedir, uri))
|
|
return -1
|
|
|
|
expected = None
|
|
outputfile = None
|
|
diff = None
|
|
if type != 'error':
|
|
output = test.xpathEval('string(output)')
|
|
if output == 'No output file.':
|
|
output = None
|
|
if output == '':
|
|
output = None
|
|
if output != None:
|
|
if basedir != None:
|
|
output = basedir + "/" + output
|
|
if os.access(output, os.R_OK) == 0:
|
|
print("Result for %s missing: %s" % (id, output))
|
|
output = None
|
|
else:
|
|
try:
|
|
f = open(output)
|
|
expected = f.read()
|
|
outputfile = output
|
|
except:
|
|
print("Result for %s unreadable: %s" % (id, output))
|
|
|
|
try:
|
|
# print("testing %s" % (URI))
|
|
doc = libxml2.parseFile(URI)
|
|
except:
|
|
doc = None
|
|
if doc != None:
|
|
res = doc.xincludeProcess()
|
|
if res >= 0 and expected != None:
|
|
result = doc.serialize()
|
|
if result != expected:
|
|
print("Result for %s differs" % (id))
|
|
open("xinclude.res", "w").write(result)
|
|
diff = os.popen("diff %s xinclude.res" % outputfile).read()
|
|
|
|
doc.freeDoc()
|
|
else:
|
|
print("Failed to parse %s" % (URI))
|
|
res = -1
|
|
|
|
|
|
|
|
test_nr = test_nr + 1
|
|
if type == 'success':
|
|
if res > 0:
|
|
test_succeed = test_succeed + 1
|
|
elif res == 0:
|
|
test_failed = test_failed + 1
|
|
print("Test %s: no substitution done ???" % (id))
|
|
elif res < 0:
|
|
test_error = test_error + 1
|
|
print("Test %s: failed valid XInclude processing" % (id))
|
|
elif type == 'error':
|
|
if res > 0:
|
|
test_error = test_error + 1
|
|
print("Test %s: failed to detect invalid XInclude processing" % (id))
|
|
elif res == 0:
|
|
test_failed = test_failed + 1
|
|
print("Test %s: Invalid but no substitution done" % (id))
|
|
elif res < 0:
|
|
test_succeed = test_succeed + 1
|
|
elif type == 'optional':
|
|
if res > 0:
|
|
test_succeed = test_succeed + 1
|
|
else:
|
|
print("Test %s: failed optional test" % (id))
|
|
|
|
# Log the ontext
|
|
if res != 1:
|
|
log.write("Test ID %s\n" % (id))
|
|
log.write(" File: %s\n" % (URI))
|
|
content = test.content.strip()
|
|
while content[-1] == '\n':
|
|
content = content[0:-1]
|
|
log.write(" %s:%s\n\n" % (type, content))
|
|
if error_msg != '':
|
|
log.write(" ----\n%s ----\n" % (error_msg))
|
|
error_msg = ''
|
|
log.write("\n")
|
|
if diff != None:
|
|
log.write("diff from test %s:\n" %(id))
|
|
log.write(" -----------\n%s\n -----------\n" % (diff));
|
|
|
|
return 0
|
|
|
|
|
|
def runTestCases(case):
|
|
creator = case.prop('creator')
|
|
if creator != None:
|
|
print("=>", creator)
|
|
base = case.getBase(None)
|
|
basedir = case.prop('basedir')
|
|
if basedir != None:
|
|
base = libxml2.buildURI(basedir, base)
|
|
test = case.children
|
|
while test != None:
|
|
if test.name == 'testcase':
|
|
runTest(test, base)
|
|
if test.name == 'testcases':
|
|
runTestCases(test)
|
|
test = test.next
|
|
|
|
conf = libxml2.parseFile(CONF)
|
|
if conf is None:
|
|
print("Unable to load %s" % CONF)
|
|
sys.exit(1)
|
|
|
|
testsuite = conf.getRootElement()
|
|
if testsuite.name != 'testsuite':
|
|
print("Expecting TESTSUITE root element: aborting")
|
|
sys.exit(1)
|
|
|
|
profile = testsuite.prop('PROFILE')
|
|
if profile != None:
|
|
print(profile)
|
|
|
|
start = time.time()
|
|
|
|
case = testsuite.children
|
|
while case != None:
|
|
if case.name == 'testcases':
|
|
old_test_nr = test_nr
|
|
old_test_succeed = test_succeed
|
|
old_test_failed = test_failed
|
|
old_test_error = test_error
|
|
runTestCases(case)
|
|
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))
|
|
case = case.next
|
|
|
|
conf.freeDoc()
|
|
log.close()
|
|
|
|
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))
|