Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 419 lines (360 sloc) 10.578 kb
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
1 #!/usr/bin/python
2 import sys
3 import time
4 import os
5 import string
6 import StringIO
cb40c22 changed changed sys.path setting from 'append' to 'insert' (patch suppli...
William M. Brack authored
7 sys.path.insert(0, "python")
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
8 import libxml2
9
10 # Memory debug specific
11 libxml2.debugMemory(1)
12 debug = 0
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
13 quiet = 1
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
14
15 #
16 # the testsuite description
17 #
9ebb632 patches from John Carr to start cleaning up 'make diskcheck' problems c....
Daniel Veillard authored
18 CONF=os.path.join(os.path.dirname(__file__), "test/relaxng/testsuite.xml")
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
71 # mem = libxml2.debugMemory(1);
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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()
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
95 # if mem != libxml2.debugMemory(1):
96 # print "validating instance %d line %d leaks" % (
97 # nb_instances_tests, node.lineNo())
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
124 # mem = libxml2.debugMemory(1);
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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()
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
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)
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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 + " "
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
344 if quiet == 0:
345 print msg
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
346 sections = node.xpathEval('section')
347 if sections != [] and level <= 0:
348 msg = ""
349 for section in sections:
350 msg = msg + section.content + " "
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
351 if quiet == 0:
352 print "Tests for section %s" % (msg)
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
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)
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
394 if quiet == 0:
395 print "Running Relax NG testsuite"
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
396 handle_testSuite(root)
397
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
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" % (
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
402 nb_schemas_tests, nb_schemas_success, nb_schemas_failed)
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
403 if quiet == 0 or nb_instances_failed != 0:
404 print "found %d test instances: %d success %d failures" % (
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
405 nb_instances_tests, nb_instances_success, nb_instances_failed)
406
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
407
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
408 testsuite.freeDoc()
409
410 # Memory debug specific
411 libxml2.relaxNGCleanupTypes()
412 libxml2.cleanupParser()
413 if libxml2.debugMemory(1) == 0:
6dc9196 remove a memory leak on schemas type facets. reduce verbosity incorporat...
Daniel Veillard authored
414 if quiet == 0:
415 print "OK"
a76fe5c integrated the Out Of Memory test from Havoc Pennington #109368 a lot of
Daniel Veillard authored
416 else:
417 print "Memory leak %d bytes" % (libxml2.debugMemory(1))
418 libxml2.dumpMemory()
Something went wrong with that request. Please try again.