Home | History | Annotate | Download | only in libxml2
      1 #!/usr/bin/python
      2 import sys
      3 import time
      4 import os
      5 import string
      6 sys.path.insert(0, "python")
      7 import libxml2
      8 
      9 #
     10 # the testsuite description
     11 #
     12 DIR="xinclude-test-suite"
     13 CONF="testdescr.xml"
     14 LOG="check-xinclude-test-suite.log"
     15 
     16 log = open(LOG, "w")
     17 
     18 os.chdir(DIR)
     19 
     20 test_nr = 0
     21 test_succeed = 0
     22 test_failed = 0
     23 test_error = 0
     24 #
     25 # Error and warning handlers
     26 #
     27 error_nr = 0
     28 error_msg = ''
     29 
     30 def errorHandler(ctx, str):
     31     global error_nr
     32     global error_msg
     33 
     34     if string.find(str, "error:") >= 0:
     35 	error_nr = error_nr + 1
     36     if len(error_msg) < 300:
     37         if len(error_msg) == 0 or error_msg[-1] == '\n':
     38 	    error_msg = error_msg + "   >>" + str
     39 	else:
     40 	    error_msg = error_msg + str
     41 
     42 libxml2.registerErrorHandler(errorHandler, None)
     43 
     44 def testXInclude(filename, id):
     45     global error_nr
     46     global error_msg
     47     global log
     48 
     49     error_nr = 0
     50     error_msg = ''
     51 
     52     print "testXInclude(%s, %s)" % (filename, id)
     53     return 1
     54 
     55 def runTest(test, basedir):
     56     global test_nr
     57     global test_failed
     58     global test_error
     59     global test_succeed
     60     global error_msg
     61     global log
     62 
     63     fatal_error = 0
     64     uri = test.prop('href')
     65     id = test.prop('id')
     66     type = test.prop('type')
     67     if uri == None:
     68         print "Test without ID:", uri
     69 	return -1
     70     if id == None:
     71         print "Test without URI:", id
     72 	return -1
     73     if type == None:
     74         print "Test without URI:", id
     75 	return -1
     76     if basedir != None:
     77 	URI = basedir + "/" + uri
     78     else:
     79         URI = uri
     80     if os.access(URI, os.R_OK) == 0:
     81         print "Test %s missing: base %s uri %s" % (URI, basedir, uri)
     82 	return -1
     83 
     84     expected = None
     85     outputfile = None
     86     diff = None
     87     if type != 'error':
     88 	output = test.xpathEval('string(output)')
     89 	if output == 'No output file.':
     90 	    output = None
     91 	if output == '':
     92 	    output = None
     93 	if output != None:
     94 	    if basedir != None:
     95 		output = basedir + "/" + output
     96 	    if os.access(output, os.R_OK) == 0:
     97 		print "Result for %s missing: %s" % (id, output)
     98 		output = None
     99 	    else:
    100 		try:
    101 		    f = open(output)
    102 		    expected = f.read()
    103 		    outputfile = output
    104 		except:
    105 		    print "Result for %s unreadable: %s" % (id, output)
    106 
    107     try:
    108         # print "testing %s" % (URI)
    109 	doc = libxml2.parseFile(URI)
    110     except:
    111         doc = None
    112     if doc != None:
    113         res = doc.xincludeProcess()
    114 	if res >= 0 and expected != None:
    115 	    result = doc.serialize()
    116 	    if result != expected:
    117 	        print "Result for %s differs" % (id)
    118 		open("xinclude.res", "w").write(result)
    119 		diff = os.popen("diff %s xinclude.res" % outputfile).read()
    120 
    121 	doc.freeDoc()
    122     else:
    123         print "Failed to parse %s" % (URI)
    124 	res = -1
    125 
    126     
    127 
    128     test_nr = test_nr + 1
    129     if type == 'success':
    130 	if res > 0:
    131 	    test_succeed = test_succeed + 1
    132 	elif res == 0:
    133 	    test_failed = test_failed + 1
    134 	    print "Test %s: no substitution done ???" % (id)
    135 	elif res < 0:
    136 	    test_error = test_error + 1
    137 	    print "Test %s: failed valid XInclude processing" % (id)
    138     elif type == 'error':
    139 	if res > 0:
    140 	    test_error = test_error + 1
    141 	    print "Test %s: failed to detect invalid XInclude processing" % (id)
    142 	elif res == 0:
    143 	    test_failed = test_failed + 1
    144 	    print "Test %s: Invalid but no substitution done" % (id)
    145 	elif res < 0:
    146 	    test_succeed = test_succeed + 1
    147     elif type == 'optional':
    148 	if res > 0:
    149 	    test_succeed = test_succeed + 1
    150 	else:
    151 	    print "Test %s: failed optional test" % (id)
    152 
    153     # Log the ontext
    154     if res != 1:
    155 	log.write("Test ID %s\n" % (id))
    156 	log.write("   File: %s\n" % (URI))
    157 	content = string.strip(test.content)
    158 	while content[-1] == '\n':
    159 	    content = content[0:-1]
    160 	log.write("   %s:%s\n\n" % (type, content))
    161 	if error_msg != '':
    162 	    log.write("   ----\n%s   ----\n" % (error_msg))
    163 	    error_msg = ''
    164 	log.write("\n")
    165     if diff != None:
    166         log.write("diff from test %s:\n" %(id))
    167 	log.write("   -----------\n%s\n   -----------\n" % (diff));
    168 
    169     return 0
    170 	    
    171 
    172 def runTestCases(case):
    173     creator = case.prop('creator')
    174     if creator != None:
    175 	print "=>", creator
    176     base = case.getBase(None)
    177     basedir = case.prop('basedir')
    178     if basedir != None:
    179 	base = libxml2.buildURI(basedir, base)
    180     test = case.children
    181     while test != None:
    182         if test.name == 'testcase':
    183 	    runTest(test, base)
    184 	if test.name == 'testcases':
    185 	    runTestCases(test)
    186         test = test.next
    187         
    188 conf = libxml2.parseFile(CONF)
    189 if conf == None:
    190     print "Unable to load %s" % CONF
    191     sys.exit(1)
    192 
    193 testsuite = conf.getRootElement()
    194 if testsuite.name != 'testsuite':
    195     print "Expecting TESTSUITE root element: aborting"
    196     sys.exit(1)
    197 
    198 profile = testsuite.prop('PROFILE')
    199 if profile != None:
    200     print profile
    201 
    202 start = time.time()
    203 
    204 case = testsuite.children
    205 while case != None:
    206     if case.name == 'testcases':
    207 	old_test_nr = test_nr
    208 	old_test_succeed = test_succeed
    209 	old_test_failed = test_failed
    210 	old_test_error = test_error
    211         runTestCases(case)
    212 	print "   Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
    213 	       test_nr - old_test_nr, test_succeed - old_test_succeed,
    214 	       test_failed - old_test_failed, test_error - old_test_error)
    215     case = case.next
    216 
    217 conf.freeDoc()
    218 log.close()
    219 
    220 print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
    221       test_nr, test_succeed, test_failed, test_error, time.time() - start)
    222