123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- #!/usr/bin/python
- import sys
- import time
- import os
- import string
- 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 string.find(str, "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 == None:
- print "Test without ID:", uri
- return -1
- if id == None:
- print "Test without URI:", id
- return -1
- if type == 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 = string.strip(test.content)
- 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 == 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 suceeded, %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 suceeded, %d failed and %d generated an error in %.2f s." % (
- test_nr, test_succeed, test_failed, test_error, time.time() - start)
|