Commit d749528a authored by Alexey Neyman's avatar Alexey Neyman Committed by Daniel Veillard

Silent the new python test on input

Just make it silent if there is no error
parent a9016c49
...@@ -26,103 +26,118 @@ pystrings = { ...@@ -26,103 +26,118 @@ pystrings = {
<!ENTITY sample.entity "replacement text">''' <!ENTITY sample.entity "replacement text">'''
} }
def verify_doc(doc):
e = doc.getRootElement()
if e.name != 'root':
raise ValueError("name")
if e.content != 'replacement text':
raise ValueError("content")
prefix = "py://strings/" prefix = "py://strings/"
startURL = prefix + "xml/sample.xml"
catURL = prefix + "catalogs/catalog.xml"
def my_input_cb(URI): def my_input_cb(URI):
idx = URI.startswith(prefix) if not(URI.startswith(prefix)):
if idx == -1:
return None return None
path = URI[len(prefix):] path = URI[len(prefix):]
if path not in pystrings: if path not in pystrings:
print "my_input_cb: path does not exist, '%s'" % path
return None return None
print "my_input_cb: loading '%s'" % URI
return StringIO.StringIO(pystrings[path]) return StringIO.StringIO(pystrings[path])
opts = libxml2.XML_PARSE_DTDLOAD | libxml2.XML_PARSE_NONET | libxml2.XML_PARSE_COMPACT
startURL = prefix + "xml/sample.xml" def run_test(desc, docpath, catalog, exp_status="verified", exp_err=[], test_callback=None,
catURL = prefix + "catalogs/catalog.xml" root_name="root", root_content="replacement text"):
opts = libxml2.XML_PARSE_DTDLOAD | libxml2.XML_PARSE_NONET | libxml2.XML_PARSE_COMPACT
actual_err = []
def my_global_error_cb(ctx, msg):
actual_err.append((-1, msg))
def my_ctx_error_cb(arg, msg, severity, reserved):
actual_err.append((severity, msg))
libxml2.registerErrorHandler(my_global_error_cb, None)
try:
parser = libxml2.createURLParserCtxt(docpath, opts)
parser.setErrorHandler(my_ctx_error_cb, None)
if catalog is not None:
parser.addLocalCatalog(catalog)
if test_callback is not None:
test_callback()
parser.parseDocument()
doc = parser.doc()
actual_status = "loaded"
e = doc.getRootElement()
if e.name == root_name and e.content == root_content:
actual_status = "verified"
doc.freeDoc()
except libxml2.parserError:
actual_status = "not loaded"
if actual_status != exp_status:
print "Test '%s' failed: expect status '%s', actual '%s'" % (desc, exp_status, actual_status)
sys.exit(1)
elif actual_err != exp_err:
print "Test '%s' failed" % desc
print "Expect errors:"
for s,m in exp_err: print " [%2d] '%s'" % (s,m)
print "Actual errors:"
for s,m in actual_err: print " [%2d] '%s'" % (s,m)
sys.exit(1)
# Check that we cannot read custom schema without custom callback # Check that we cannot read custom schema without custom callback
print run_test(desc="Loading entity without custom callback",
print "Test 1: Expecting failure to load (custom scheme not handled)" docpath=startURL, catalog=None,
try: exp_status="not loaded", exp_err=[
doc = libxml2.readFile(startURL, None, opts) (-1, "I/O "),
print "Read custom scheme without registering handler succeeded?" (-1, "warning : "),
sys.exit(1) (-1, "failed to load external entity \"py://strings/xml/sample.xml\"\n")
except libxml2.treeError, e: ])
pass
# Register handler and try to load the same entity # Register handler and try to load the same entity
print
print "Test 2: Expecting failure to load (no catalog - cannot load DTD)"
libxml2.registerInputCallback(my_input_cb) libxml2.registerInputCallback(my_input_cb)
doc = libxml2.readFile(startURL, None, opts) run_test(desc="Loading entity with custom callback",
try: docpath=startURL, catalog=None,
verify_doc(doc) exp_status="loaded", exp_err=[
print "Doc was loaded?" (-1, "Attempt to load network entity http://example.com/dtds/sample.dtd"),
except ValueError, e: ( 4, "Entity 'sample.entity' not defined\n")
if str(e) != "content": ])
print "Doc verify failed"
doc.freeDoc()
# Register a catalog (also accessible via pystr://) and retry # Register a catalog (also accessible via pystr://) and retry
print run_test(desc="Loading entity with custom callback and catalog",
print "Test 3: Expecting successful loading" docpath=startURL, catalog=catURL)
parser = libxml2.createURLParserCtxt(startURL, opts)
parser.addLocalCatalog(catURL)
parser.parseDocument()
doc = parser.doc()
verify_doc(doc)
doc.freeDoc()
# Unregister custom callback when parser is already created # Unregister custom callback when parser is already created
print run_test(desc="Loading entity and unregistering callback",
print "Test 4: Expect failure to read (custom callback unregistered during read)" docpath=startURL, catalog=catURL,
parser = libxml2.createURLParserCtxt(startURL, opts) test_callback=lambda: libxml2.popInputCallbacks(),
libxml2.popInputCallbacks() exp_status="loaded", exp_err=[
parser.addLocalCatalog(catURL) ( 3, "failed to load external entity \"py://strings/dtds/sample.dtd\"\n"),
parser.parseDocument() ( 4, "Entity 'sample.entity' not defined\n")
doc = parser.doc() ])
try:
verify_doc(doc)
print "Doc was loaded?"
except ValueError, e:
if str(e) != "content":
print "Doc verify failed"
doc.freeDoc()
# Try to load the document again # Try to load the document again
print run_test(desc="Retry loading document after unregistering callback",
print "Test 5: Expect failure to load (callback unregistered)" docpath=startURL, catalog=catURL,
try: exp_status="not loaded", exp_err=[
doc = libxml2.readFile(startURL, None, opts) (-1, "I/O "),
print "Read custom scheme without registering handler succeeded?" (-1, "warning : "),
sys.exit(1) (-1, "failed to load external entity \"py://strings/xml/sample.xml\"\n")
except libxml2.treeError, e: ])
pass
# But should be able to read standard I/O yet... # But should be able to read standard I/O yet...
print run_test(desc="Loading using standard i/o after unregistering callback",
print "Test 6: Expect successful loading using standard I/O" docpath="tst.xml", catalog=None,
doc = libxml2.readFile("tst.xml", None, opts) root_name='doc', root_content='bar')
doc.freeDoc()
# Now pop ALL input callbacks, should fail to load even standard I/O # Now pop ALL input callbacks, should fail to load even standard I/O
print
print "Test 7: Remove all input callbacks, expect failure to load using standard I/O"
try: try:
while True: while True:
libxml2.popInputCallbacks() libxml2.popInputCallbacks()
except IndexError, e: except IndexError, e:
print "Popped all input callbacks: " + str(e)
try:
doc = libxml2.readFile("tst.xml", None, opts)
except libxml2.treeError, e:
pass pass
run_test(desc="Loading using standard i/o after unregistering all callbacks",
docpath="tst.xml", catalog=None,
exp_status="not loaded", exp_err=[
(-1, "I/O "),
(-1, "warning : "),
(-1, "failed to load external entity \"tst.xml\"\n")
])
print "OK"
sys.exit(0);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment