libxml2 2.9.1 clean sources
[tomato.git] / release / src / router / libxml2 / check-xml-test-suite.py
blob2de07b1095c368cd141d8c2926b71222a434a4b5
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
9 test_nr = 0
10 test_succeed = 0
11 test_failed = 0
12 test_error = 0
15 # the testsuite description
17 CONF="xml-test-suite/xmlconf/xmlconf.xml"
18 LOG="check-xml-test-suite.log"
20 log = open(LOG, "w")
23 # Error and warning handlers
25 error_nr = 0
26 error_msg = ''
27 def errorHandler(ctx, str):
28 global error_nr
29 global error_msg
31 error_nr = error_nr + 1
32 if len(error_msg) < 300:
33 if len(error_msg) == 0 or error_msg[-1] == '\n':
34 error_msg = error_msg + " >>" + str
35 else:
36 error_msg = error_msg + str
38 libxml2.registerErrorHandler(errorHandler, None)
40 #warning_nr = 0
41 #warning = ''
42 #def warningHandler(ctx, str):
43 # global warning_nr
44 # global warning
46 # warning_nr = warning_nr + 1
47 # warning = warning + str
49 #libxml2.registerWarningHandler(warningHandler, None)
52 # Used to load the XML testsuite description
54 def loadNoentDoc(filename):
55 ctxt = libxml2.createFileParserCtxt(filename)
56 if ctxt == None:
57 return None
58 ctxt.replaceEntities(1)
59 ctxt.parseDocument()
60 try:
61 doc = ctxt.doc()
62 except:
63 doc = None
64 if ctxt.wellFormed() != 1:
65 doc.freeDoc()
66 return None
67 return doc
70 # The conformance testing routines
73 def testNotWf(filename, id):
74 global error_nr
75 global error_msg
76 global log
78 error_nr = 0
79 error_msg = ''
81 ctxt = libxml2.createFileParserCtxt(filename)
82 if ctxt == None:
83 return -1
84 ret = ctxt.parseDocument()
86 try:
87 doc = ctxt.doc()
88 except:
89 doc = None
90 if doc != None:
91 doc.freeDoc()
92 if ret == 0 or ctxt.wellFormed() != 0:
93 print "%s: error: Well Formedness error not detected" % (id)
94 log.write("%s: error: Well Formedness error not detected\n" % (id))
95 return 0
96 return 1
98 def testNotWfEnt(filename, id):
99 global error_nr
100 global error_msg
101 global log
103 error_nr = 0
104 error_msg = ''
106 ctxt = libxml2.createFileParserCtxt(filename)
107 if ctxt == None:
108 return -1
109 ctxt.replaceEntities(1)
110 ret = ctxt.parseDocument()
112 try:
113 doc = ctxt.doc()
114 except:
115 doc = None
116 if doc != None:
117 doc.freeDoc()
118 if ret == 0 or ctxt.wellFormed() != 0:
119 print "%s: error: Well Formedness error not detected" % (id)
120 log.write("%s: error: Well Formedness error not detected\n" % (id))
121 return 0
122 return 1
124 def testNotWfEntDtd(filename, id):
125 global error_nr
126 global error_msg
127 global log
129 error_nr = 0
130 error_msg = ''
132 ctxt = libxml2.createFileParserCtxt(filename)
133 if ctxt == None:
134 return -1
135 ctxt.replaceEntities(1)
136 ctxt.loadSubset(1)
137 ret = ctxt.parseDocument()
139 try:
140 doc = ctxt.doc()
141 except:
142 doc = None
143 if doc != None:
144 doc.freeDoc()
145 if ret == 0 or ctxt.wellFormed() != 0:
146 print "%s: error: Well Formedness error not detected" % (id)
147 log.write("%s: error: Well Formedness error not detected\n" % (id))
148 return 0
149 return 1
151 def testWfEntDtd(filename, id):
152 global error_nr
153 global error_msg
154 global log
156 error_nr = 0
157 error_msg = ''
159 ctxt = libxml2.createFileParserCtxt(filename)
160 if ctxt == None:
161 return -1
162 ctxt.replaceEntities(1)
163 ctxt.loadSubset(1)
164 ret = ctxt.parseDocument()
166 try:
167 doc = ctxt.doc()
168 except:
169 doc = None
170 if doc == None or ret != 0 or ctxt.wellFormed() == 0:
171 print "%s: error: wrongly failed to parse the document" % (id)
172 log.write("%s: error: wrongly failed to parse the document\n" % (id))
173 if doc != None:
174 doc.freeDoc()
175 return 0
176 if error_nr != 0:
177 print "%s: warning: WF document generated an error msg" % (id)
178 log.write("%s: error: WF document generated an error msg\n" % (id))
179 doc.freeDoc()
180 return 2
181 doc.freeDoc()
182 return 1
184 def testError(filename, id):
185 global error_nr
186 global error_msg
187 global log
189 error_nr = 0
190 error_msg = ''
192 ctxt = libxml2.createFileParserCtxt(filename)
193 if ctxt == None:
194 return -1
195 ctxt.replaceEntities(1)
196 ctxt.loadSubset(1)
197 ret = ctxt.parseDocument()
199 try:
200 doc = ctxt.doc()
201 except:
202 doc = None
203 if doc != None:
204 doc.freeDoc()
205 if ctxt.wellFormed() == 0:
206 print "%s: warning: failed to parse the document but accepted" % (id)
207 log.write("%s: warning: failed to parse the document but accepte\n" % (id))
208 return 2
209 if error_nr != 0:
210 print "%s: warning: WF document generated an error msg" % (id)
211 log.write("%s: error: WF document generated an error msg\n" % (id))
212 return 2
213 return 1
215 def testInvalid(filename, id):
216 global error_nr
217 global error_msg
218 global log
220 error_nr = 0
221 error_msg = ''
223 ctxt = libxml2.createFileParserCtxt(filename)
224 if ctxt == None:
225 return -1
226 ctxt.validate(1)
227 ret = ctxt.parseDocument()
229 try:
230 doc = ctxt.doc()
231 except:
232 doc = None
233 valid = ctxt.isValid()
234 if doc == None:
235 print "%s: error: wrongly failed to parse the document" % (id)
236 log.write("%s: error: wrongly failed to parse the document\n" % (id))
237 return 0
238 if valid == 1:
239 print "%s: error: Validity error not detected" % (id)
240 log.write("%s: error: Validity error not detected\n" % (id))
241 doc.freeDoc()
242 return 0
243 if error_nr == 0:
244 print "%s: warning: Validity error not reported" % (id)
245 log.write("%s: warning: Validity error not reported\n" % (id))
246 doc.freeDoc()
247 return 2
249 doc.freeDoc()
250 return 1
252 def testValid(filename, id):
253 global error_nr
254 global error_msg
256 error_nr = 0
257 error_msg = ''
259 ctxt = libxml2.createFileParserCtxt(filename)
260 if ctxt == None:
261 return -1
262 ctxt.validate(1)
263 ctxt.parseDocument()
265 try:
266 doc = ctxt.doc()
267 except:
268 doc = None
269 valid = ctxt.isValid()
270 if doc == None:
271 print "%s: error: wrongly failed to parse the document" % (id)
272 log.write("%s: error: wrongly failed to parse the document\n" % (id))
273 return 0
274 if valid != 1:
275 print "%s: error: Validity check failed" % (id)
276 log.write("%s: error: Validity check failed\n" % (id))
277 doc.freeDoc()
278 return 0
279 if error_nr != 0 or valid != 1:
280 print "%s: warning: valid document reported an error" % (id)
281 log.write("%s: warning: valid document reported an error\n" % (id))
282 doc.freeDoc()
283 return 2
284 doc.freeDoc()
285 return 1
287 def runTest(test):
288 global test_nr
289 global test_succeed
290 global test_failed
291 global error_msg
292 global log
294 uri = test.prop('URI')
295 id = test.prop('ID')
296 if uri == None:
297 print "Test without ID:", uri
298 return -1
299 if id == None:
300 print "Test without URI:", id
301 return -1
302 base = test.getBase(None)
303 URI = libxml2.buildURI(uri, base)
304 if os.access(URI, os.R_OK) == 0:
305 print "Test %s missing: base %s uri %s" % (URI, base, uri)
306 return -1
307 type = test.prop('TYPE')
308 if type == None:
309 print "Test %s missing TYPE" % (id)
310 return -1
312 extra = None
313 if type == "invalid":
314 res = testInvalid(URI, id)
315 elif type == "valid":
316 res = testValid(URI, id)
317 elif type == "not-wf":
318 extra = test.prop('ENTITIES')
319 # print URI
320 #if extra == None:
321 # res = testNotWfEntDtd(URI, id)
322 #elif extra == 'none':
323 # res = testNotWf(URI, id)
324 #elif extra == 'general':
325 # res = testNotWfEnt(URI, id)
326 #elif extra == 'both' or extra == 'parameter':
327 res = testNotWfEntDtd(URI, id)
328 #else:
329 # print "Unknow value %s for an ENTITIES test value" % (extra)
330 # return -1
331 elif type == "error":
332 res = testError(URI, id)
333 else:
334 # TODO skipped for now
335 return -1
337 test_nr = test_nr + 1
338 if res > 0:
339 test_succeed = test_succeed + 1
340 elif res == 0:
341 test_failed = test_failed + 1
342 elif res < 0:
343 test_error = test_error + 1
345 # Log the ontext
346 if res != 1:
347 log.write(" File: %s\n" % (URI))
348 content = string.strip(test.content)
349 while content[-1] == '\n':
350 content = content[0:-1]
351 if extra != None:
352 log.write(" %s:%s:%s\n" % (type, extra, content))
353 else:
354 log.write(" %s:%s\n\n" % (type, content))
355 if error_msg != '':
356 log.write(" ----\n%s ----\n" % (error_msg))
357 error_msg = ''
358 log.write("\n")
360 return 0
363 def runTestCases(case):
364 profile = case.prop('PROFILE')
365 if profile != None and \
366 string.find(profile, "IBM XML Conformance Test Suite - Production") < 0:
367 print "=>", profile
368 test = case.children
369 while test != None:
370 if test.name == 'TEST':
371 runTest(test)
372 if test.name == 'TESTCASES':
373 runTestCases(test)
374 test = test.next
376 conf = loadNoentDoc(CONF)
377 if conf == None:
378 print "Unable to load %s" % CONF
379 sys.exit(1)
381 testsuite = conf.getRootElement()
382 if testsuite.name != 'TESTSUITE':
383 print "Expecting TESTSUITE root element: aborting"
384 sys.exit(1)
386 profile = testsuite.prop('PROFILE')
387 if profile != None:
388 print profile
390 start = time.time()
392 case = testsuite.children
393 while case != None:
394 if case.name == 'TESTCASES':
395 old_test_nr = test_nr
396 old_test_succeed = test_succeed
397 old_test_failed = test_failed
398 old_test_error = test_error
399 runTestCases(case)
400 print " Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
401 test_nr - old_test_nr, test_succeed - old_test_succeed,
402 test_failed - old_test_failed, test_error - old_test_error)
403 case = case.next
405 conf.freeDoc()
406 log.close()
408 print "Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
409 test_nr, test_succeed, test_failed, test_error, time.time() - start)