1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
"""
:copyright: Copyright 2006-2009 by Oliver Schoenborn, all rights reserved.
:license: BSD, see LICENSE.txt for details.
"""
import unittest
from unittests import wtc
def throws():
raise RuntimeError('test')
#---------------------------------------------------------------------------
class lib_pubsub_Except(wtc.PubsubTestCase):
def testHandleExcept1a(self):
from wx.lib.pubsub.utils.exchandling import ExcPublisher
excPublisher = ExcPublisher(self.pub.getDefaultTopicMgr() )
self.pub.setListenerExcHandler(excPublisher)
# create a listener that raises an exception:
from .lib_pubsub_except_raisinglistener import getRaisingListener
raisingListener = getRaisingListener()
self.pub.setNotificationFlags(all=False)
self.pub.subscribe(raisingListener, 'testHandleExcept1a')
# first test when a listener raises an exception and exception listener also raises!
class BadUncaughtExcListener:
def __call__(self, listenerStr=None, excTraceback=None):
raise RuntimeError('bad exception listener!')
handler = BadUncaughtExcListener()
self.pub.subscribe(handler, ExcPublisher.topicUncaughtExc)
self.assertRaises(self.pub.ExcHandlerError, self.pub.sendMessage,
'testHandleExcept1a')
def testHandleExcept1b(self):
# create a listener that raises an exception:
from .lib_pubsub_except_raisinglistener import getRaisingListener
raisingListener = getRaisingListener()
self.pub.subscribe(raisingListener, 'testHandleExcept1b')
# subscribe a good exception listener and validate
# create the listener for uncaught exceptions in listeners:
class UncaughtExcListener:
def __call__(self, listenerStr=None, excTraceback=None):
# verify that information received; first the listenerStr
assert listenerStr.startswith('raisingListener')
# next the traceback:
tb = excTraceback.traceback
self.assertEqual(len(tb), 2)
def validateTB(tbItem, eFN, eLine, eFnN, assertE=self.assertEqual):
assert tbItem[0].endswith(eFN), '%s !~ %s' % (tbItem[0], eFN)
assertE(tbItem[1], eLine)
assertE(tbItem[2], eFnN)
validateTB(tb[0], 'lib_pubsub_except_raisinglistener.py', 5, 'raisingListener')
validateTB(tb[1], 'lib_pubsub_except_raisinglistener.py', 4, 'nested')
# next the formatted traceback:
self.assertEqual(len(excTraceback.getFormattedList() ), len(tb)+1)
# finally the string for formatted traceback:
msg = excTraceback.getFormattedString()
assert msg.startswith(' File')
assert msg.endswith("name 'RuntimeError2' is not defined\n")
from wx.lib.pubsub.utils.exchandling import ExcPublisher
if not self.pub.getDefaultTopicMgr().hasTopicDefinition(ExcPublisher.topicUncaughtExc):
excPublisher = ExcPublisher(self.pub.getDefaultTopicMgr() )
self.pub.setListenerExcHandler(excPublisher)
topic = self.pub.getDefaultTopicMgr().getTopic(ExcPublisher.topicUncaughtExc)
assert not topic.hasListeners()
handler = UncaughtExcListener()
handler.assertEqual = self.assertEqual
self.pub.subscribe(handler, ExcPublisher.topicUncaughtExc)
self.pub.sendMessage('testHandleExcept1b')
# verify that listener isn't stuck in a cyclic reference by sys.exc_info()
del raisingListener
assert not self.pub.getDefaultTopicMgr().getTopic('testHandleExcept1b').hasListeners()
def testHandleExcept2(self):
#Test sendMessage when one handler, then change handler and verify changed
testTopic = 'testTopics.testHandleExcept2'
self.pub.subscribe(throws, testTopic)
self.pub.setListenerExcHandler(None)
#pubsub.utils.notification.useNotifyByWriteFile()
#assert_equal( self.pub.getDefaultTopicMgr().getTopic(testTopic).getNumListeners(), 1 )
expect = None
def validate(className):
global expect
assert expect == className
expect = None
class MyExcHandler:
def __call__(self, listener, topicObj):
validate(self.__class__.__name__)
class MyExcHandler2:
def __call__(self, listener, topicObj):
validate(self.__class__.__name__)
def doHandling(HandlerClass):
global expect
expect = HandlerClass.__name__ #'MyExcHandler'
excHandler = HandlerClass()
self.pub.setListenerExcHandler(excHandler)
self.pub.sendMessage(testTopic)
assert expect is None
doHandling(MyExcHandler)
doHandling(MyExcHandler2)
# restore to no handling and verify:
self.pub.setListenerExcHandler(None)
self.assertRaises(RuntimeError, self.pub.sendMessage, testTopic)
def testNoExceptionHandling1(self):
self.pub.setListenerExcHandler(None)
def raises():
raise RuntimeError('test')
self.pub.getDefaultTopicMgr().getOrCreateTopic('testNoExceptionTrapping')
self.pub.subscribe(raises, 'testNoExceptionTrapping')
self.assertRaises(RuntimeError, self.pub.sendMessage, 'testNoExceptionTrapping')
def testNoExceptionHandling2(self):
testTopic = 'testTopics.testNoExceptionHandling'
self.pub.subscribe(throws, testTopic)
assert self.pub.getListenerExcHandler() is None
self.assertRaises(RuntimeError, self.pub.sendMessage, testTopic)
#---------------------------------------------------------------------------
if __name__ == '__main__':
unittest.main()
|