Exemple #1
0
    def test_event_restrictions(self):
        dispatcher = Dispatcher(( 1, 2 ))
        handler = mock.Mock(return_value=None)
        self.assertTrue(dispatcher.register(1, handler))
        dispatcher.dispatch(1, 'arg', kw='kw')
        handler.assert_called_once_with(1, 'arg', kw='kw')
        self.assertTrue(dispatcher.unregister(1, handler))

        handler.reset_mock()
        self.assertFalse(dispatcher.register(-1, handler))
        dispatcher.dispatch(-1, 'arg', kw='kw')
        handler.assert_not_called()
        self.assertFalse(dispatcher.unregister(-1, handler))
Exemple #2
0
    def test_dispatch_failing_deferred(self, _LOGGER): # pylint: disable=redefined-outer-name
        dispatcher = Dispatcher()
        results = None

        def _raise_deferred(_d, _err, _event, *_args, **_kw): # pylint: disable=unused-argument
            def __raise(_):
                raise _err(_event + ' no-go')

            _d.addCallback(__raise)

            def _recordresult(_arg):
                results.append(_arg)

                return _arg

            _d.addBoth(_recordresult)

            return _d

        for e in ( TypeError, ValueError, WeirdoError ):
            results = []
            d = t_defer.Deferred()
            raising_handler = functools.partial(_raise_deferred, d, e)
            dispatcher.once('bingo', raising_handler)
            dispatcher.dispatch('bingo', 'arg', kw='kw')
            d.callback(None)
            self.assertTrue(d.called)
            self.assertEqual(len(results), 1)
            self.assertIsInstance(results[-1], t_failure.Failure)
            self.assertIs(results[-1].type, e)
            self.assertEqual(results[-1].value.args[0], 'bingo no-go')
            self.assertEqual(_LOGGER.warning.call_count, 1)
            self.assertIsNotNone(_LOGGER.warning.call_args)
            warning_args, warning_kw = _LOGGER.warning.call_args
            self.assertEqual(len(warning_args), 1)
            self.assertTrue(warning_args[0].startswith('failure raised from deferred event callback '))
            self.assertEqual(len(warning_kw), 0)
            _LOGGER.reset_mock()
Exemple #3
0
    def test_dispatch_exception(self, _LOGGER): # pylint: disable=redefined-outer-name
        dispatcher = Dispatcher()
        raising_handler = mock.Mock(return_value=None)
        dispatcher.register('bingo', raising_handler)

        def _raise(_err, _event, *_args, **_kw): # pylint: disable=unused-argument
            raise _err(_event + ' no-go')

        for e in ( TypeError, ValueError, WeirdoError ):
            raise_e = functools.partial(_raise, e)
            raising_handler.side_effect = raise_e
            dispatcher.dispatch('bingo', 'arg', kw='kw')
            raising_handler.assert_called_once_with('bingo', 'arg', kw='kw')
            self.assertEqual(_LOGGER.warning.call_count, 1)
            self.assertIsNotNone(_LOGGER.warning.call_args)
            warning_args, warning_kw = _LOGGER.warning.call_args
            self.assertEqual(len(warning_args), 1)
            self.assertTrue(warning_args[0].startswith('exception raised from event callback '))
            self.assertEqual(len(warning_kw), 1)
            self.assertIs(warning_kw.get('exc_info', False), True)
            raising_handler.reset_mock()
            raising_handler.side_effect = None
            _LOGGER.reset_mock()
Exemple #4
0
    def test_registration(self):
        results = None

        def _handler(_i, _event):
            try:
                l = results[_i]
            except KeyError:
                l = results[_i] = []

            l.append(_event)

        _handler1 = functools.partial(_handler, 1)
        _handler2 = functools.partial(_handler, 2)

        results = {}
        dispatcher = Dispatcher()
        self.assertTrue(dispatcher.register('a', _handler1))
        self.assertFalse(dispatcher.unregister('a', _handler1, once=True))
        self.assertTrue(dispatcher.unregister('a', _handler1))
        dispatcher.dispatch('a')
        self.assertEqual(len(results), 0)

        results = {}
        dispatcher = Dispatcher()
        self.assertTrue(dispatcher.once('a', _handler1))
        self.assertFalse(dispatcher.unregister('a', _handler1))
        self.assertTrue(dispatcher.unregister('a', _handler1, once=True))
        dispatcher.dispatch('a')
        self.assertEqual(len(results), 0)

        results = {}
        dispatcher = Dispatcher()
        self.assertTrue(dispatcher.on('a', _handler1))
        self.assertTrue(dispatcher.on('a', _handler1))
        self.assertTrue(dispatcher.once('a', _handler2))
        dispatcher.dispatch('a')

        expected = {
            1: [ 'a', 'a' ],
            2: [ 'a' ],
        }

        self.assertEqual(results, expected)
        self.assertFalse(dispatcher.unregister('a', _handler2, once=True))
        dispatcher.dispatch('a')
        expected[1].extend([ 'a', 'a' ])
        self.assertEqual(results, expected)
        self.assertTrue(dispatcher.unregister('a', _handler1))
        dispatcher.dispatch('a')
        expected[1].append('a')
        self.assertEqual(results, expected)
        self.assertTrue(dispatcher.unregister('a', _handler1))
        dispatcher.dispatch('a')
        self.assertEqual(results, expected)