1: #!/usr/bin/python -u
2: #
3: # this tests the DTD validation with the XmlTextReader interface
4: #
5: import sys
6: import glob
7: import string
8: import libxml2
9: try:
10: import StringIO
11: str_io = StringIO.StringIO
12: except:
13: import io
14: str_io = io.StringIO
15:
16: # Memory debug specific
17: libxml2.debugMemory(1)
18:
19: err=""
20: expect="""../../test/valid/rss.xml:177: element rss: validity error : Element rss does not carry attribute version
21: </rss>
22: ^
23: ../../test/valid/xlink.xml:450: element termdef: validity error : ID dt-arc already defined
24: <p><termdef id="dt-arc" term="Arc">An <ter
25: ^
26: ../../test/valid/xlink.xml:530: validity error : attribute def line 199 references an unknown ID "dt-xlg"
27:
28: ^
29: """
30: def callback(ctx, str):
31: global err
32: err = err + "%s" % (str)
33: libxml2.registerErrorHandler(callback, "")
34:
35: valid_files = glob.glob("../../test/valid/*.x*")
36: valid_files.sort()
37: for file in valid_files:
38: if file.find("t8") != -1:
39: continue
40: if file == "../../test/valid/rss.xml":
41: continue
42: if file == "../../test/valid/xlink.xml":
43: continue
44: reader = libxml2.newTextReaderFilename(file)
45: #print "%s:" % (file)
46: reader.SetParserProp(libxml2.PARSER_VALIDATE, 1)
47: ret = reader.Read()
48: while ret == 1:
49: ret = reader.Read()
50: if ret != 0:
51: print("Error parsing and validating %s" % (file))
52: #sys.exit(1)
53:
54: if err != expect:
55: print(err)
56:
57: #
58: # another separate test based on Stephane Bidoul one
59: #
60: s = """
61: <!DOCTYPE test [
62: <!ELEMENT test (x,b)>
63: <!ELEMENT x (c)>
64: <!ELEMENT b (#PCDATA)>
65: <!ELEMENT c (#PCDATA)>
66: <!ENTITY x "<x><c>xxx</c></x>">
67: ]>
68: <test>
69: &x;
70: <b>bbb</b>
71: </test>
72: """
73: expect="""10,test
74: 1,test
75: 14,#text
76: 1,x
77: 1,c
78: 3,#text
79: 15,c
80: 15,x
81: 14,#text
82: 1,b
83: 3,#text
84: 15,b
85: 14,#text
86: 15,test
87: """
88: res=""
89: err=""
90:
91: input = libxml2.inputBuffer(str_io(s))
92: reader = input.newTextReader("test2")
93: reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
94: reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
95: reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
96: reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
97: while reader.Read() == 1:
98: res = res + "%s,%s\n" % (reader.NodeType(),reader.Name())
99:
100: if res != expect:
101: print("test2 failed: unexpected output")
102: print(res)
103: sys.exit(1)
104: if err != "":
105: print("test2 failed: validation error found")
106: print(err)
107: sys.exit(1)
108:
109: #
110: # Another test for external entity parsing and validation
111: #
112:
113: s = """<!DOCTYPE test [
114: <!ELEMENT test (x)>
115: <!ELEMENT x (#PCDATA)>
116: <!ENTITY e SYSTEM "tst.ent">
117: ]>
118: <test>
119: &e;
120: </test>
121: """
122: tst_ent = """<x>hello</x>"""
123: expect="""10 test
124: 1 test
125: 14 #text
126: 1 x
127: 3 #text
128: 15 x
129: 14 #text
130: 15 test
131: """
132: res=""
133:
134: def myResolver(URL, ID, ctxt):
135: if URL == "tst.ent":
136: return(str_io(tst_ent))
137: return None
138:
139: libxml2.setEntityLoader(myResolver)
140:
141: input = libxml2.inputBuffer(str_io(s))
142: reader = input.newTextReader("test3")
143: reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
144: reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
145: reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
146: reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
147: while reader.Read() == 1:
148: res = res + "%s %s\n" % (reader.NodeType(),reader.Name())
149:
150: if res != expect:
151: print("test3 failed: unexpected output")
152: print(res)
153: sys.exit(1)
154: if err != "":
155: print("test3 failed: validation error found")
156: print(err)
157: sys.exit(1)
158:
159: #
160: # Another test for recursive entity parsing, validation, and replacement of
161: # entities, making sure the entity ref node doesn't show up in that case
162: #
163:
164: s = """<!DOCTYPE test [
165: <!ELEMENT test (x, x)>
166: <!ELEMENT x (y)>
167: <!ELEMENT y (#PCDATA)>
168: <!ENTITY x "<x>&y;</x>">
169: <!ENTITY y "<y>yyy</y>">
170: ]>
171: <test>
172: &x;
173: &x;
174: </test>"""
175: expect="""10 test 0
176: 1 test 0
177: 14 #text 1
178: 1 x 1
179: 1 y 2
180: 3 #text 3
181: 15 y 2
182: 15 x 1
183: 14 #text 1
184: 1 x 1
185: 1 y 2
186: 3 #text 3
187: 15 y 2
188: 15 x 1
189: 14 #text 1
190: 15 test 0
191: """
192: res=""
193: err=""
194:
195: input = libxml2.inputBuffer(str_io(s))
196: reader = input.newTextReader("test4")
197: reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
198: reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
199: reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
200: reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
201: while reader.Read() == 1:
202: res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
203:
204: if res != expect:
205: print("test4 failed: unexpected output")
206: print(res)
207: sys.exit(1)
208: if err != "":
209: print("test4 failed: validation error found")
210: print(err)
211: sys.exit(1)
212:
213: #
214: # The same test but without entity substitution this time
215: #
216:
217: s = """<!DOCTYPE test [
218: <!ELEMENT test (x, x)>
219: <!ELEMENT x (y)>
220: <!ELEMENT y (#PCDATA)>
221: <!ENTITY x "<x>&y;</x>">
222: <!ENTITY y "<y>yyy</y>">
223: ]>
224: <test>
225: &x;
226: &x;
227: </test>"""
228: expect="""10 test 0
229: 1 test 0
230: 14 #text 1
231: 5 x 1
232: 14 #text 1
233: 5 x 1
234: 14 #text 1
235: 15 test 0
236: """
237: res=""
238: err=""
239:
240: input = libxml2.inputBuffer(str_io(s))
241: reader = input.newTextReader("test5")
242: reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
243: while reader.Read() == 1:
244: res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
245:
246: if res != expect:
247: print("test5 failed: unexpected output")
248: print(res)
249: if err != "":
250: print("test5 failed: validation error found")
251: print(err)
252:
253: #
254: # cleanup
255: #
256: del input
257: del reader
258:
259: # Memory debug specific
260: libxml2.cleanupParser()
261: if libxml2.debugMemory(1) == 0:
262: print("OK")
263: else:
264: print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
265: libxml2.dumpMemory()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>