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