File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / python / tests / reader2.py
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:34 2014 UTC (10 years, 5 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

    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>