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