Annotation of embedaddon/libxml2/check-xsddata-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/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>