@@ -1057,60 +1057,51 @@ def test_expat_entityresolver_default(self):
10571057
10581058 def test_external_entity_ref_keyboard_interrupt (self ):
10591059 # gh-148427: KeyboardInterrupt must propagate, not be swallowed
1060- class KBHandler (handler .ContentHandler ):
1061- def startElement (self , name , attrs ):
1062- if name == 'entity' :
1063- raise KeyboardInterrupt ('test' )
1060+ eh = mock .Mock ()
1061+ eh .startElement .side_effect = KeyboardInterrupt ('test' )
10641062
10651063 parser = create_parser ()
10661064 parser .setFeature (feature_external_ges , True )
10671065 parser .setEntityResolver (self .TestEntityResolver ())
1068- parser .setContentHandler (KBHandler () )
1066+ parser .setContentHandler (eh )
10691067
1068+ parser .feed ('<!DOCTYPE doc [\n ' )
1069+ parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1070+ parser .feed (']>\n ' )
10701071 with self .assertRaises (KeyboardInterrupt ):
1071- parser .feed ('<!DOCTYPE doc [\n ' )
1072- parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1073- parser .feed (']>\n ' )
10741072 parser .feed ('<doc>&test;</doc>' )
1075- parser .close ()
10761073
10771074 def test_external_entity_ref_system_exit (self ):
10781075 # gh-148427: SystemExit must propagate, not be swallowed
1079- class ExitHandler (handler .ContentHandler ):
1080- def startElement (self , name , attrs ):
1081- if name == 'entity' :
1082- raise SystemExit (42 )
1076+ eh = mock .Mock ()
1077+ eh .startElement .side_effect = SystemExit (42 )
10831078
10841079 parser = create_parser ()
10851080 parser .setFeature (feature_external_ges , True )
10861081 parser .setEntityResolver (self .TestEntityResolver ())
1087- parser .setContentHandler (ExitHandler () )
1082+ parser .setContentHandler (eh )
10881083
1084+ parser .feed ('<!DOCTYPE doc [\n ' )
1085+ parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1086+ parser .feed (']>\n ' )
10891087 with self .assertRaises (SystemExit ):
1090- parser .feed ('<!DOCTYPE doc [\n ' )
1091- parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1092- parser .feed (']>\n ' )
10931088 parser .feed ('<doc>&test;</doc>' )
1094- parser .close ()
10951089
10961090 def test_external_entity_ref_stack_cleanup (self ):
10971091 # gh-148427: _entity_stack must be cleaned up after errors
1098- class ErrorHandler (handler .ContentHandler ):
1099- def startElement (self , name , attrs ):
1100- if name == 'entity' :
1101- raise ValueError ('test error' )
1092+ eh = mock .Mock ()
1093+ eh .startElement .side_effect = ValueError ('test error' )
11021094
11031095 parser = create_parser ()
11041096 parser .setFeature (feature_external_ges , True )
11051097 parser .setEntityResolver (self .TestEntityResolver ())
1106- parser .setContentHandler (ErrorHandler () )
1098+ parser .setContentHandler (eh )
11071099
1100+ parser .feed ('<!DOCTYPE doc [\n ' )
1101+ parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1102+ parser .feed (']>\n ' )
11081103 with self .assertRaises (SAXParseException ):
1109- parser .feed ('<!DOCTYPE doc [\n ' )
1110- parser .feed (' <!ENTITY test SYSTEM "whatever">\n ' )
1111- parser .feed (']>\n ' )
11121104 parser .feed ('<doc>&test;</doc>' )
1113- parser .close ()
11141105
11151106 self .assertEqual (len (parser ._entity_stack ), 0 )
11161107
0 commit comments