Annotation of embedaddon/libxml2/check-xml-test-suite.py, revision 1.1.1.1
1.1 misho 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: test_nr = 0
10: test_succeed = 0
11: test_failed = 0
12: test_error = 0
13:
14: #
15: # the testsuite description
16: #
17: CONF="xml-test-suite/xmlconf/xmlconf.xml"
18: LOG="check-xml-test-suite.log"
19:
20: log = open(LOG, "w")
21:
22: #
23: # Error and warning handlers
24: #
25: error_nr = 0
26: error_msg = ''
27: def errorHandler(ctx, str):
28: global error_nr
29: global error_msg
30:
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
37:
38: libxml2.registerErrorHandler(errorHandler, None)
39:
40: #warning_nr = 0
41: #warning = ''
42: #def warningHandler(ctx, str):
43: # global warning_nr
44: # global warning
45: #
46: # warning_nr = warning_nr + 1
47: # warning = warning + str
48: #
49: #libxml2.registerWarningHandler(warningHandler, None)
50:
51: #
52: # Used to load the XML testsuite description
53: #
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
68:
69: #
70: # The conformance testing routines
71: #
72:
73: def testNotWf(filename, id):
74: global error_nr
75: global error_msg
76: global log
77:
78: error_nr = 0
79: error_msg = ''
80:
81: ctxt = libxml2.createFileParserCtxt(filename)
82: if ctxt == None:
83: return -1
84: ret = ctxt.parseDocument()
85:
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
97:
98: def testNotWfEnt(filename, id):
99: global error_nr
100: global error_msg
101: global log
102:
103: error_nr = 0
104: error_msg = ''
105:
106: ctxt = libxml2.createFileParserCtxt(filename)
107: if ctxt == None:
108: return -1
109: ctxt.replaceEntities(1)
110: ret = ctxt.parseDocument()
111:
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
123:
124: def testNotWfEntDtd(filename, id):
125: global error_nr
126: global error_msg
127: global log
128:
129: error_nr = 0
130: error_msg = ''
131:
132: ctxt = libxml2.createFileParserCtxt(filename)
133: if ctxt == None:
134: return -1
135: ctxt.replaceEntities(1)
136: ctxt.loadSubset(1)
137: ret = ctxt.parseDocument()
138:
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
150:
151: def testWfEntDtd(filename, id):
152: global error_nr
153: global error_msg
154: global log
155:
156: error_nr = 0
157: error_msg = ''
158:
159: ctxt = libxml2.createFileParserCtxt(filename)
160: if ctxt == None:
161: return -1
162: ctxt.replaceEntities(1)
163: ctxt.loadSubset(1)
164: ret = ctxt.parseDocument()
165:
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
183:
184: def testError(filename, id):
185: global error_nr
186: global error_msg
187: global log
188:
189: error_nr = 0
190: error_msg = ''
191:
192: ctxt = libxml2.createFileParserCtxt(filename)
193: if ctxt == None:
194: return -1
195: ctxt.replaceEntities(1)
196: ctxt.loadSubset(1)
197: ret = ctxt.parseDocument()
198:
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
214:
215: def testInvalid(filename, id):
216: global error_nr
217: global error_msg
218: global log
219:
220: error_nr = 0
221: error_msg = ''
222:
223: ctxt = libxml2.createFileParserCtxt(filename)
224: if ctxt == None:
225: return -1
226: ctxt.validate(1)
227: ret = ctxt.parseDocument()
228:
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
248:
249: doc.freeDoc()
250: return 1
251:
252: def testValid(filename, id):
253: global error_nr
254: global error_msg
255:
256: error_nr = 0
257: error_msg = ''
258:
259: ctxt = libxml2.createFileParserCtxt(filename)
260: if ctxt == None:
261: return -1
262: ctxt.validate(1)
263: ctxt.parseDocument()
264:
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
286:
287: def runTest(test):
288: global test_nr
289: global test_succeed
290: global test_failed
291: global error_msg
292: global log
293:
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
311:
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
336:
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
344:
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")
359:
360: return 0
361:
362:
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
375:
376: conf = loadNoentDoc(CONF)
377: if conf == None:
378: print "Unable to load %s" % CONF
379: sys.exit(1)
380:
381: testsuite = conf.getRootElement()
382: if testsuite.name != 'TESTSUITE':
383: print "Expecting TESTSUITE root element: aborting"
384: sys.exit(1)
385:
386: profile = testsuite.prop('PROFILE')
387: if profile != None:
388: print profile
389:
390: start = time.time()
391:
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
404:
405: conf.freeDoc()
406: log.close()
407:
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)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>