1#!/usr/bin/python -u 2# 3# this tests the entities substitutions with the XmlTextReader interface 4# 5import sys 6import libxml2 7try: 8 import StringIO 9 str_io = StringIO.StringIO 10except: 11 import io 12 str_io = io.StringIO 13 14schema="""<element name="foo" xmlns="http://relaxng.org/ns/structure/1.0" 15 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> 16 <oneOrMore> 17 <element name="label"> 18 <text/> 19 </element> 20 <optional> 21 <element name="opt"> 22 <empty/> 23 </element> 24 </optional> 25 <element name="item"> 26 <data type="byte"/> 27 </element> 28 </oneOrMore> 29</element> 30""" 31# Memory debug specific 32libxml2.debugMemory(1) 33 34# 35# Parse the Relax NG Schemas 36# 37rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema)) 38rngs = rngp.relaxNGParse() 39del rngp 40 41# 42# Parse and validate the correct document 43# 44docstr="""<foo> 45<label>some text</label> 46<item>100</item> 47</foo>""" 48 49f = str_io(docstr) 50input = libxml2.inputBuffer(f) 51reader = input.newTextReader("correct") 52reader.RelaxNGSetSchema(rngs) 53ret = reader.Read() 54while ret == 1: 55 ret = reader.Read() 56 57if ret != 0: 58 print("Error parsing the document") 59 sys.exit(1) 60 61if reader.IsValid() != 1: 62 print("Document failed to validate") 63 sys.exit(1) 64 65# 66# Parse and validate the incorrect document 67# 68docstr="""<foo> 69<label>some text</label> 70<item>1000</item> 71</foo>""" 72 73err="" 74# RNG errors are not as good as before , TODO 75#expect="""RNG validity error: file error line 3 element text 76#Type byte doesn't allow value '1000' 77#RNG validity error: file error line 3 element text 78#Error validating datatype byte 79#RNG validity error: file error line 3 element text 80#Element item failed to validate content 81#""" 82expect="""Type byte doesn't allow value '1000' 83Error validating datatype byte 84Element item failed to validate content 85""" 86 87def callback(ctx, str): 88 global err 89 err = err + "%s" % (str) 90libxml2.registerErrorHandler(callback, "") 91 92f = str_io(docstr) 93input = libxml2.inputBuffer(f) 94reader = input.newTextReader("error") 95reader.RelaxNGSetSchema(rngs) 96ret = reader.Read() 97while ret == 1: 98 ret = reader.Read() 99 100if ret != 0: 101 print("Error parsing the document") 102 sys.exit(1) 103 104if reader.IsValid() != 0: 105 print("Document failed to detect the validation error") 106 sys.exit(1) 107 108if err != expect: 109 print("Did not get the expected error message:") 110 print(err) 111 sys.exit(1) 112 113# 114# cleanup 115# 116del f 117del input 118del reader 119del rngs 120libxml2.relaxNGCleanupTypes() 121 122# Memory debug specific 123libxml2.cleanupParser() 124if libxml2.debugMemory(1) == 0: 125 print("OK") 126else: 127 print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 128 libxml2.dumpMemory() 129