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