1 #!/usr/bin/python -u 2 # 3 # this tests the entities substitutions with the XmlTextReader interface 4 # 5 import sys 6 import libxml2 7 try: 8 import StringIO 9 str_io = StringIO.StringIO 10 except: 11 import io 12 str_io = io.StringIO 13 14 docstr="""<?xml version='1.0'?> 15 <!DOCTYPE doc [ 16 <!ENTITY tst "<p>test</p>"> 17 ]> 18 <doc>&tst;</doc>""" 19 20 # Memory debug specific 21 libxml2.debugMemory(1) 22 23 # 24 # First test, normal don't substitute entities. 25 # 26 f = str_io(docstr) 27 input = libxml2.inputBuffer(f) 28 reader = input.newTextReader("test_noent") 29 ret = reader.Read() 30 if ret != 1: 31 print("Error reading to root") 32 sys.exit(1) 33 if reader.Name() == "doc" or reader.NodeType() == 10: 34 ret = reader.Read() 35 if ret != 1: 36 print("Error reading to root") 37 sys.exit(1) 38 if reader.Name() != "doc" or reader.NodeType() != 1: 39 print("test_normal: Error reading the root element") 40 sys.exit(1) 41 ret = reader.Read() 42 if ret != 1: 43 print("test_normal: Error reading to the entity") 44 sys.exit(1) 45 if reader.Name() != "tst" or reader.NodeType() != 5: 46 print("test_normal: Error reading the entity") 47 sys.exit(1) 48 ret = reader.Read() 49 if ret != 1: 50 print("test_normal: Error reading to the end of root") 51 sys.exit(1) 52 if reader.Name() != "doc" or reader.NodeType() != 15: 53 print("test_normal: Error reading the end of the root element") 54 sys.exit(1) 55 ret = reader.Read() 56 if ret != 0: 57 print("test_normal: Error detecting the end") 58 sys.exit(1) 59 60 # 61 # Second test, completely substitute the entities. 62 # 63 f = str_io(docstr) 64 input = libxml2.inputBuffer(f) 65 reader = input.newTextReader("test_noent") 66 reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES, 1) 67 ret = reader.Read() 68 if ret != 1: 69 print("Error reading to root") 70 sys.exit(1) 71 if reader.Name() == "doc" or reader.NodeType() == 10: 72 ret = reader.Read() 73 if ret != 1: 74 print("Error reading to root") 75 sys.exit(1) 76 if reader.Name() != "doc" or reader.NodeType() != 1: 77 print("test_noent: Error reading the root element") 78 sys.exit(1) 79 ret = reader.Read() 80 if ret != 1: 81 print("test_noent: Error reading to the entity content") 82 sys.exit(1) 83 if reader.Name() != "p" or reader.NodeType() != 1: 84 print("test_noent: Error reading the p element from entity") 85 sys.exit(1) 86 ret = reader.Read() 87 if ret != 1: 88 print("test_noent: Error reading to the text node") 89 sys.exit(1) 90 if reader.NodeType() != 3 or reader.Value() != "test": 91 print("test_noent: Error reading the text node") 92 sys.exit(1) 93 ret = reader.Read() 94 if ret != 1: 95 print("test_noent: Error reading to the end of p element") 96 sys.exit(1) 97 if reader.Name() != "p" or reader.NodeType() != 15: 98 print("test_noent: Error reading the end of the p element") 99 sys.exit(1) 100 ret = reader.Read() 101 if ret != 1: 102 print("test_noent: Error reading to the end of root") 103 sys.exit(1) 104 if reader.Name() != "doc" or reader.NodeType() != 15: 105 print("test_noent: Error reading the end of the root element") 106 sys.exit(1) 107 ret = reader.Read() 108 if ret != 0: 109 print("test_noent: Error detecting the end") 110 sys.exit(1) 111 112 # 113 # third test, crazy stuff about empty element in external parsed entities 114 # 115 s = """<!DOCTYPE struct [ 116 <!ENTITY simplestruct2.ent SYSTEM "simplestruct2.ent"> 117 ]> 118 <struct>&simplestruct2.ent;</struct> 119 """ 120 expect="""10 struct 0 0 121 1 struct 0 0 122 1 descr 1 1 123 15 struct 0 0 124 """ 125 res="" 126 simplestruct2_ent="""<descr/>""" 127 128 def myResolver(URL, ID, ctxt): 129 if URL == "simplestruct2.ent": 130 return(str_io(simplestruct2_ent)) 131 return None 132 133 libxml2.setEntityLoader(myResolver) 134 135 input = libxml2.inputBuffer(str_io(s)) 136 reader = input.newTextReader("test3") 137 reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1) 138 while reader.Read() == 1: 139 res = res + "%s %s %d %d\n" % (reader.NodeType(),reader.Name(), 140 reader.Depth(),reader.IsEmptyElement()) 141 142 if res != expect: 143 print("test3 failed: unexpected output") 144 print(res) 145 sys.exit(1) 146 147 # 148 # cleanup 149 # 150 del f 151 del input 152 del reader 153 154 # Memory debug specific 155 libxml2.cleanupParser() 156 if libxml2.debugMemory(1) == 0: 157 print("OK") 158 else: 159 print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 160 libxml2.dumpMemory() 161