2022-12-07 00:40:01 +03:00
#!/usr/bin/env python3
2002-12-29 01:56:33 +03:00
#
2003-01-05 04:27:54 +03:00
# this tests the entities substitutions with the XmlTextReader interface
2002-12-29 01:56:33 +03:00
#
import sys
2023-08-15 13:49:27 +03:00
import setup_test
2002-12-29 01:56:33 +03:00
import libxml2
2013-03-30 17:38:20 +04:00
try :
import StringIO
str_io = StringIO . StringIO
except :
import io
str_io = io . StringIO
2002-12-29 01:56:33 +03:00
docstr = """ <?xml version= ' 1.0 ' ?>
< ! DOCTYPE doc [
< ! ENTITY tst " <p>test</p> " >
] >
< doc > & tst ; < / doc > """
# Memory debug specific
libxml2 . debugMemory ( 1 )
#
# First test, normal don't substitute entities.
#
2013-03-30 17:38:20 +04:00
f = str_io ( docstr )
2002-12-29 01:56:33 +03:00
input = libxml2 . inputBuffer ( f )
reader = input . newTextReader ( " test_noent " )
ret = reader . Read ( )
2003-01-05 04:27:54 +03:00
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " Error reading to root " )
2003-01-05 04:27:54 +03:00
sys . exit ( 1 )
if reader . Name ( ) == " doc " or reader . NodeType ( ) == 10 :
ret = reader . Read ( )
2002-12-29 01:56:33 +03:00
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " Error reading to root " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " doc " or reader . NodeType ( ) != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error reading the root element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error reading to the entity " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " tst " or reader . NodeType ( ) != 5 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error reading the entity " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error reading to the end of root " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " doc " or reader . NodeType ( ) != 15 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error reading the end of the root element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 0 :
2013-03-30 17:38:20 +04:00
print ( " test_normal: Error detecting the end " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
#
# Second test, completely substitute the entities.
#
2013-03-30 17:38:20 +04:00
f = str_io ( docstr )
2002-12-29 01:56:33 +03:00
input = libxml2 . inputBuffer ( f )
reader = input . newTextReader ( " test_noent " )
reader . SetParserProp ( libxml2 . PARSER_SUBST_ENTITIES , 1 )
ret = reader . Read ( )
2003-01-05 04:27:54 +03:00
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " Error reading to root " )
2003-01-05 04:27:54 +03:00
sys . exit ( 1 )
if reader . Name ( ) == " doc " or reader . NodeType ( ) == 10 :
ret = reader . Read ( )
2002-12-29 01:56:33 +03:00
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " Error reading to root " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " doc " or reader . NodeType ( ) != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading the root element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading to the entity content " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " p " or reader . NodeType ( ) != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading the p element from entity " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading to the text node " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . NodeType ( ) != 3 or reader . Value ( ) != " test " :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading the text node " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading to the end of p element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " p " or reader . NodeType ( ) != 15 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading the end of the p element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 1 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading to the end of root " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
if reader . Name ( ) != " doc " or reader . NodeType ( ) != 15 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error reading the end of the root element " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
ret = reader . Read ( )
if ret != 0 :
2013-03-30 17:38:20 +04:00
print ( " test_noent: Error detecting the end " )
2002-12-29 01:56:33 +03:00
sys . exit ( 1 )
2003-01-10 02:19:02 +03:00
#
# third test, crazy stuff about empty element in external parsed entities
#
s = """ <!DOCTYPE struct [
< ! ENTITY simplestruct2 . ent SYSTEM " simplestruct2.ent " >
] >
< struct > & simplestruct2 . ent ; < / struct >
"""
expect = """ 10 struct 0 0
1 struct 0 0
1 descr 1 1
15 struct 0 0
"""
res = " "
simplestruct2_ent = """ <descr/> """
def myResolver ( URL , ID , ctxt ) :
if URL == " simplestruct2.ent " :
2013-03-30 17:38:20 +04:00
return ( str_io ( simplestruct2_ent ) )
2003-01-10 02:19:02 +03:00
return None
libxml2 . setEntityLoader ( myResolver )
2013-03-30 17:38:20 +04:00
input = libxml2 . inputBuffer ( str_io ( s ) )
2003-01-10 02:19:02 +03:00
reader = input . newTextReader ( " test3 " )
reader . SetParserProp ( libxml2 . PARSER_SUBST_ENTITIES , 1 )
while reader . Read ( ) == 1 :
res = res + " %s %s %d %d \n " % ( reader . NodeType ( ) , reader . Name ( ) ,
reader . Depth ( ) , reader . IsEmptyElement ( ) )
if res != expect :
2013-03-30 17:38:20 +04:00
print ( " test3 failed: unexpected output " )
print ( res )
2003-01-10 02:19:02 +03:00
sys . exit ( 1 )
2003-01-01 17:50:44 +03:00
#
# cleanup
#
2002-12-29 01:56:33 +03:00
del f
del input
del reader
# Memory debug specific
libxml2 . cleanupParser ( )
if libxml2 . debugMemory ( 1 ) == 0 :
2013-03-30 17:38:20 +04:00
print ( " OK " )
2002-12-29 01:56:33 +03:00
else :
2013-03-30 17:38:20 +04:00
print ( " Memory leak %d bytes " % ( libxml2 . debugMemory ( 1 ) ) )