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 succeeded, %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 succeeded, %d failed and %d generated an error in %.2f s." % (
|
---|
221 | test_nr, test_succeed, test_failed, test_error, time.time() - start)
|
---|