Annotation of embedaddon/libxml2/check-relaxng-test-suite2.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: import StringIO
7: sys.path.insert(0, "python")
8: import libxml2
9:
10: # Memory debug specific
11: libxml2.debugMemory(1)
12: debug = 0
13: quiet = 1
14:
15: #
16: # the testsuite description
17: #
18: CONF=os.path.join(os.path.dirname(__file__), "test/relaxng/testsuite.xml")
19: LOG="check-relaxng-test-suite2.log"
20:
21: log = open(LOG, "w")
22: nb_schemas_tests = 0
23: nb_schemas_success = 0
24: nb_schemas_failed = 0
25: nb_instances_tests = 0
26: nb_instances_success = 0
27: nb_instances_failed = 0
28:
29: libxml2.lineNumbersDefault(1)
30: #
31: # Resolver callback
32: #
33: resources = {}
34: def resolver(URL, ID, ctxt):
35: global resources
36:
37: if resources.has_key(URL):
38: return(StringIO.StringIO(resources[URL]))
39: log.write("Resolver failure: asked %s\n" % (URL))
40: log.write("resources: %s\n" % (resources))
41: return None
42:
43: #
44: # Load the previous results
45: #
46: #results = {}
47: #previous = {}
48: #
49: #try:
50: # res = libxml2.parseFile(RES)
51: #except:
52: # log.write("Could not parse %s" % (RES))
53:
54: #
55: # handle a valid instance
56: #
57: def handle_valid(node, schema):
58: global log
59: global nb_instances_success
60: global nb_instances_failed
61:
62: instance = node.prop("dtd")
63: if instance == None:
64: instance = ""
65: child = node.children
66: while child != None:
67: if child.type != 'text':
68: instance = instance + child.serialize()
69: child = child.next
70:
71: # mem = libxml2.debugMemory(1);
72: try:
73: doc = libxml2.parseDoc(instance)
74: except:
75: doc = None
76:
77: if doc == None:
78: log.write("\nFailed to parse correct instance:\n-----\n")
79: log.write(instance)
80: log.write("\n-----\n")
81: nb_instances_failed = nb_instances_failed + 1
82: return
83:
84: if debug:
85: print "instance line %d" % (node.lineNo())
86:
87: try:
88: ctxt = schema.relaxNGNewValidCtxt()
89: ret = doc.relaxNGValidateDoc(ctxt)
90: del ctxt
91: except:
92: ret = -1
93:
94: doc.freeDoc()
95: # if mem != libxml2.debugMemory(1):
96: # print "validating instance %d line %d leaks" % (
97: # nb_instances_tests, node.lineNo())
98:
99: if ret != 0:
100: log.write("\nFailed to validate correct instance:\n-----\n")
101: log.write(instance)
102: log.write("\n-----\n")
103: nb_instances_failed = nb_instances_failed + 1
104: else:
105: nb_instances_success = nb_instances_success + 1
106:
107: #
108: # handle an invalid instance
109: #
110: def handle_invalid(node, schema):
111: global log
112: global nb_instances_success
113: global nb_instances_failed
114:
115: instance = node.prop("dtd")
116: if instance == None:
117: instance = ""
118: child = node.children
119: while child != None:
120: if child.type != 'text':
121: instance = instance + child.serialize()
122: child = child.next
123:
124: # mem = libxml2.debugMemory(1);
125:
126: try:
127: doc = libxml2.parseDoc(instance)
128: except:
129: doc = None
130:
131: if doc == None:
132: log.write("\nStrange: failed to parse incorrect instance:\n-----\n")
133: log.write(instance)
134: log.write("\n-----\n")
135: return
136:
137: if debug:
138: print "instance line %d" % (node.lineNo())
139:
140: try:
141: ctxt = schema.relaxNGNewValidCtxt()
142: ret = doc.relaxNGValidateDoc(ctxt)
143: del ctxt
144:
145: except:
146: ret = -1
147:
148: doc.freeDoc()
149: # mem2 = libxml2.debugMemory(1)
150: # if mem != mem2:
151: # print "validating instance %d line %d leaks %d bytes" % (
152: # nb_instances_tests, node.lineNo(), mem2 - mem)
153:
154: if ret == 0:
155: log.write("\nFailed to detect validation problem in instance:\n-----\n")
156: log.write(instance)
157: log.write("\n-----\n")
158: nb_instances_failed = nb_instances_failed + 1
159: else:
160: nb_instances_success = nb_instances_success + 1
161:
162: #
163: # handle an incorrect test
164: #
165: def handle_correct(node):
166: global log
167: global nb_schemas_success
168: global nb_schemas_failed
169:
170: schema = ""
171: child = node.children
172: while child != None:
173: if child.type != 'text':
174: schema = schema + child.serialize()
175: child = child.next
176:
177: try:
178: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
179: rngs = rngp.relaxNGParse()
180: except:
181: rngs = None
182: if rngs == None:
183: log.write("\nFailed to compile correct schema:\n-----\n")
184: log.write(schema)
185: log.write("\n-----\n")
186: nb_schemas_failed = nb_schemas_failed + 1
187: else:
188: nb_schemas_success = nb_schemas_success + 1
189: return rngs
190:
191: def handle_incorrect(node):
192: global log
193: global nb_schemas_success
194: global nb_schemas_failed
195:
196: schema = ""
197: child = node.children
198: while child != None:
199: if child.type != 'text':
200: schema = schema + child.serialize()
201: child = child.next
202:
203: try:
204: rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
205: rngs = rngp.relaxNGParse()
206: except:
207: rngs = None
208: if rngs != None:
209: log.write("\nFailed to detect schema error in:\n-----\n")
210: log.write(schema)
211: log.write("\n-----\n")
212: nb_schemas_failed = nb_schemas_failed + 1
213: else:
214: # log.write("\nSuccess detecting schema error in:\n-----\n")
215: # log.write(schema)
216: # log.write("\n-----\n")
217: nb_schemas_success = nb_schemas_success + 1
218: return None
219:
220: #
221: # resource handling: keep a dictionary of URL->string mappings
222: #
223: def handle_resource(node, dir):
224: global resources
225:
226: try:
227: name = node.prop('name')
228: except:
229: name = None
230:
231: if name == None or name == '':
232: log.write("resource has no name")
233: return;
234:
235: if dir != None:
236: # name = libxml2.buildURI(name, dir)
237: name = dir + '/' + name
238:
239: res = ""
240: child = node.children
241: while child != None:
242: if child.type != 'text':
243: res = res + child.serialize()
244: child = child.next
245: resources[name] = res
246:
247: #
248: # dir handling: pseudo directory resources
249: #
250: def handle_dir(node, dir):
251: try:
252: name = node.prop('name')
253: except:
254: name = None
255:
256: if name == None or name == '':
257: log.write("resource has no name")
258: return;
259:
260: if dir != None:
261: # name = libxml2.buildURI(name, dir)
262: name = dir + '/' + name
263:
264: dirs = node.xpathEval('dir')
265: for dir in dirs:
266: handle_dir(dir, name)
267: res = node.xpathEval('resource')
268: for r in res:
269: handle_resource(r, name)
270:
271: #
272: # handle a testCase element
273: #
274: def handle_testCase(node):
275: global nb_schemas_tests
276: global nb_instances_tests
277: global resources
278:
279: sections = node.xpathEval('string(section)')
280: log.write("\n ======== test %d line %d section %s ==========\n" % (
281:
282: nb_schemas_tests, node.lineNo(), sections))
283: resources = {}
284: if debug:
285: print "test %d line %d" % (nb_schemas_tests, node.lineNo())
286:
287: dirs = node.xpathEval('dir')
288: for dir in dirs:
289: handle_dir(dir, None)
290: res = node.xpathEval('resource')
291: for r in res:
292: handle_resource(r, None)
293:
294: tsts = node.xpathEval('incorrect')
295: if tsts != []:
296: if len(tsts) != 1:
297: print "warning test line %d has more than one <incorrect> example" %(node.lineNo())
298: schema = handle_incorrect(tsts[0])
299: else:
300: tsts = node.xpathEval('correct')
301: if tsts != []:
302: if len(tsts) != 1:
303: print "warning test line %d has more than one <correct> example"% (node.lineNo())
304: schema = handle_correct(tsts[0])
305: else:
306: print "warning <testCase> line %d has no <correct> nor <incorrect> child" % (node.lineNo())
307:
308: nb_schemas_tests = nb_schemas_tests + 1;
309:
310: valids = node.xpathEval('valid')
311: invalids = node.xpathEval('invalid')
312: nb_instances_tests = nb_instances_tests + len(valids) + len(invalids)
313: if schema != None:
314: for valid in valids:
315: handle_valid(valid, schema)
316: for invalid in invalids:
317: handle_invalid(invalid, schema)
318:
319:
320: #
321: # handle a testSuite element
322: #
323: def handle_testSuite(node, level = 0):
324: global nb_schemas_tests, nb_schemas_success, nb_schemas_failed
325: global nb_instances_tests, nb_instances_success, nb_instances_failed
326: if level >= 1:
327: old_schemas_tests = nb_schemas_tests
328: old_schemas_success = nb_schemas_success
329: old_schemas_failed = nb_schemas_failed
330: old_instances_tests = nb_instances_tests
331: old_instances_success = nb_instances_success
332: old_instances_failed = nb_instances_failed
333:
334: docs = node.xpathEval('documentation')
335: authors = node.xpathEval('author')
336: if docs != []:
337: msg = ""
338: for doc in docs:
339: msg = msg + doc.content + " "
340: if authors != []:
341: msg = msg + "written by "
342: for author in authors:
343: msg = msg + author.content + " "
344: if quiet == 0:
345: print msg
346: sections = node.xpathEval('section')
347: if sections != [] and level <= 0:
348: msg = ""
349: for section in sections:
350: msg = msg + section.content + " "
351: if quiet == 0:
352: print "Tests for section %s" % (msg)
353: for test in node.xpathEval('testCase'):
354: handle_testCase(test)
355: for test in node.xpathEval('testSuite'):
356: handle_testSuite(test, level + 1)
357:
358:
359: if level >= 1 and sections != []:
360: msg = ""
361: for section in sections:
362: msg = msg + section.content + " "
363: print "Result of tests for section %s" % (msg)
364: if nb_schemas_tests != old_schemas_tests:
365: print "found %d test schemas: %d success %d failures" % (
366: nb_schemas_tests - old_schemas_tests,
367: nb_schemas_success - old_schemas_success,
368: nb_schemas_failed - old_schemas_failed)
369: if nb_instances_tests != old_instances_tests:
370: print "found %d test instances: %d success %d failures" % (
371: nb_instances_tests - old_instances_tests,
372: nb_instances_success - old_instances_success,
373: nb_instances_failed - old_instances_failed)
374: #
375: # Parse the conf file
376: #
377: libxml2.substituteEntitiesDefault(1);
378: testsuite = libxml2.parseFile(CONF)
379:
380: #
381: # Error and warnng callbacks
382: #
383: def callback(ctx, str):
384: global log
385: log.write("%s%s" % (ctx, str))
386:
387: libxml2.registerErrorHandler(callback, "")
388:
389: libxml2.setEntityLoader(resolver)
390: root = testsuite.getRootElement()
391: if root.name != 'testSuite':
392: print "%s doesn't start with a testSuite element, aborting" % (CONF)
393: sys.exit(1)
394: if quiet == 0:
395: print "Running Relax NG testsuite"
396: handle_testSuite(root)
397:
398: if quiet == 0:
399: print "\nTOTAL:\n"
400: if quiet == 0 or nb_schemas_failed != 0:
401: print "found %d test schemas: %d success %d failures" % (
402: nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
403: if quiet == 0 or nb_instances_failed != 0:
404: print "found %d test instances: %d success %d failures" % (
405: nb_instances_tests, nb_instances_success, nb_instances_failed)
406:
407:
408: testsuite.freeDoc()
409:
410: # Memory debug specific
411: libxml2.relaxNGCleanupTypes()
412: libxml2.cleanupParser()
413: if libxml2.debugMemory(1) == 0:
414: if quiet == 0:
415: print "OK"
416: else:
417: print "Memory leak %d bytes" % (libxml2.debugMemory(1))
418: libxml2.dumpMemory()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>