123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- #!/usr/bin/python -u
- #
- # this tests the DTD validation with the XmlTextReader interface
- #
- import sys
- import glob
- import string
- import StringIO
- import libxml2
- # Memory debug specific
- libxml2.debugMemory(1)
- err=""
- expect="""../../test/valid/rss.xml:177: element rss: validity error : Element rss does not carry attribute version
- </rss>
- ^
- ../../test/valid/xlink.xml:450: element termdef: validity error : ID dt-arc already defined
- <p><termdef id="dt-arc" term="Arc">An <ter
- ^
- ../../test/valid/xlink.xml:530: validity error : attribute def line 199 references an unknown ID "dt-xlg"
- ^
- """
- def callback(ctx, str):
- global err
- err = err + "%s" % (str)
- libxml2.registerErrorHandler(callback, "")
- valid_files = glob.glob("../../test/valid/*.x*")
- valid_files.sort()
- for file in valid_files:
- if string.find(file, "t8") != -1:
- continue
- reader = libxml2.newTextReaderFilename(file)
- #print "%s:" % (file)
- reader.SetParserProp(libxml2.PARSER_VALIDATE, 1)
- ret = reader.Read()
- while ret == 1:
- ret = reader.Read()
- if ret != 0:
- print "Error parsing and validating %s" % (file)
- #sys.exit(1)
- if err != expect:
- print err
- #
- # another separate test based on Stephane Bidoul one
- #
- s = """
- <!DOCTYPE test [
- <!ELEMENT test (x,b)>
- <!ELEMENT x (c)>
- <!ELEMENT b (#PCDATA)>
- <!ELEMENT c (#PCDATA)>
- <!ENTITY x "<x><c>xxx</c></x>">
- ]>
- <test>
- &x;
- <b>bbb</b>
- </test>
- """
- expect="""10,test
- 1,test
- 14,#text
- 1,x
- 1,c
- 3,#text
- 15,c
- 15,x
- 14,#text
- 1,b
- 3,#text
- 15,b
- 14,#text
- 15,test
- """
- res=""
- err=""
- input = libxml2.inputBuffer(StringIO.StringIO(s))
- reader = input.newTextReader("test2")
- reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
- reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
- reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
- reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
- while reader.Read() == 1:
- res = res + "%s,%s\n" % (reader.NodeType(),reader.Name())
- if res != expect:
- print "test2 failed: unexpected output"
- print res
- sys.exit(1)
- if err != "":
- print "test2 failed: validation error found"
- print err
- sys.exit(1)
- #
- # Another test for external entity parsing and validation
- #
- s = """<!DOCTYPE test [
- <!ELEMENT test (x)>
- <!ELEMENT x (#PCDATA)>
- <!ENTITY e SYSTEM "tst.ent">
- ]>
- <test>
- &e;
- </test>
- """
- tst_ent = """<x>hello</x>"""
- expect="""10 test
- 1 test
- 14 #text
- 1 x
- 3 #text
- 15 x
- 14 #text
- 15 test
- """
- res=""
- def myResolver(URL, ID, ctxt):
- if URL == "tst.ent":
- return(StringIO.StringIO(tst_ent))
- return None
- libxml2.setEntityLoader(myResolver)
- input = libxml2.inputBuffer(StringIO.StringIO(s))
- reader = input.newTextReader("test3")
- reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
- reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
- reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
- reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
- while reader.Read() == 1:
- res = res + "%s %s\n" % (reader.NodeType(),reader.Name())
- if res != expect:
- print "test3 failed: unexpected output"
- print res
- sys.exit(1)
- if err != "":
- print "test3 failed: validation error found"
- print err
- sys.exit(1)
- #
- # Another test for recursive entity parsing, validation, and replacement of
- # entities, making sure the entity ref node doesn't show up in that case
- #
- s = """<!DOCTYPE test [
- <!ELEMENT test (x, x)>
- <!ELEMENT x (y)>
- <!ELEMENT y (#PCDATA)>
- <!ENTITY x "<x>&y;</x>">
- <!ENTITY y "<y>yyy</y>">
- ]>
- <test>
- &x;
- &x;
- </test>"""
- expect="""10 test 0
- 1 test 0
- 14 #text 1
- 1 x 1
- 1 y 2
- 3 #text 3
- 15 y 2
- 15 x 1
- 14 #text 1
- 1 x 1
- 1 y 2
- 3 #text 3
- 15 y 2
- 15 x 1
- 14 #text 1
- 15 test 0
- """
- res=""
- err=""
- input = libxml2.inputBuffer(StringIO.StringIO(s))
- reader = input.newTextReader("test4")
- reader.SetParserProp(libxml2.PARSER_LOADDTD,1)
- reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)
- reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)
- reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
- while reader.Read() == 1:
- res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
- if res != expect:
- print "test4 failed: unexpected output"
- print res
- sys.exit(1)
- if err != "":
- print "test4 failed: validation error found"
- print err
- sys.exit(1)
- #
- # The same test but without entity substitution this time
- #
- s = """<!DOCTYPE test [
- <!ELEMENT test (x, x)>
- <!ELEMENT x (y)>
- <!ELEMENT y (#PCDATA)>
- <!ENTITY x "<x>&y;</x>">
- <!ENTITY y "<y>yyy</y>">
- ]>
- <test>
- &x;
- &x;
- </test>"""
- expect="""10 test 0
- 1 test 0
- 14 #text 1
- 5 x 1
- 14 #text 1
- 5 x 1
- 14 #text 1
- 15 test 0
- """
- res=""
- err=""
- input = libxml2.inputBuffer(StringIO.StringIO(s))
- reader = input.newTextReader("test5")
- reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
- while reader.Read() == 1:
- res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
- if res != expect:
- print "test5 failed: unexpected output"
- print res
- if err != "":
- print "test5 failed: validation error found"
- print err
- #
- # cleanup
- #
- del input
- del reader
- # Memory debug specific
- libxml2.cleanupParser()
- if libxml2.debugMemory(1) == 0:
- print "OK"
- else:
- print "Memory leak %d bytes" % (libxml2.debugMemory(1))
- libxml2.dumpMemory()
|