def test_multiple_subscribers(self): ebc = EventBusClient(EventBus()) mock1 = Mock() ebc.subscribe('news', mock1) mock2 = Mock() ebc.subscribe('alerts', mock2) mock3 = Mock() ebc.subscribe('logs', mock3) mock4 = Mock() ebc.subscribe('logs', mock4) ebc.publish('news', 'msg1') ebc.publish('alerts', 'msg2') ebc.publish('logs', 'msg3') self.assertEqual(mock1.call_count, 1) mock1.assert_called_with('news', 'msg1') self.assertEqual(mock2.call_count, 1) mock2.assert_called_with('alerts', 'msg2') self.assertEqual(mock3.call_count, 1) mock3.assert_called_with('logs', 'msg3') self.assertEqual(mock4.call_count, 1) mock4.assert_called_with('logs', 'msg3')
def test_predicates(self): ebc = EventBusClient(EventBus()) get_foos = Mock() ebc.subscribe('', get_foos, lambda msg: msg.startswith('foo')) get_bars = Mock() ebc.subscribe('', get_bars, lambda msg: msg.endswith('bar')) get_all = Mock() ebc.subscribe('', get_all) get_none = Mock() ebc.subscribe('', get_none, lambda msg: msg.find('zoo') >= 0) errored = Mock() ebc.subscribe('', errored, lambda msg: 1 / 0) ebc.publish('', 'foo') ebc.publish('', 'foobar') ebc.publish('', 'bar') c = call self.assertEqual(get_foos.call_count, 2) get_foos.assert_has_calls([c('', 'foo'), c('', 'foobar')]) self.assertEqual(get_bars.call_count, 2) get_bars.assert_has_calls([c('', 'foobar'), c('', 'bar')]) self.assertEqual(get_all.call_count, 3) get_all.assert_has_calls([c('', 'foo'), c('', 'foobar'), c('', 'bar')]) get_none.assert_not_called() errored.assert_not_called()
def test_wildcard_topic(self): ebc = EventBusClient(EventBus()) subs = [] wildcard_sub = Mock() subs.append(ebc.subscribe(re.compile(r'.*'), wildcard_sub)) prefix_sub = Mock() subs.append(ebc.subscribe(re.compile(r'ham.*'), prefix_sub)) contains_sub = Mock() subs.append(ebc.subscribe(re.compile(r'.*burg.*'), contains_sub)) ebc.publish('news', 1) ebc.publish('hamsters', 2) ebc.publish('hamburgers', 3) ebc.publish('nonsense', 4) c = call self.assertEqual(wildcard_sub.call_count, 4) wildcard_sub.assert_has_calls([ c('news', 1), c('hamsters', 2), c('hamburgers', 3), c('nonsense', 4) ]) self.assertEqual(prefix_sub.call_count, 2) prefix_sub.assert_has_calls([c('hamsters', 2), c('hamburgers', 3)]) self.assertEqual(contains_sub.call_count, 1) contains_sub.assert_has_calls([c('hamburgers', 3)]) for sub in subs: ebc.unsubscribe(sub) self.assertEqual(ebc.list_subscribers(), [])
def __init__(self, agent, device_id, alarm_sync_tasks, db, advertise_events=False, states=DEFAULT_STATES, transitions=DEFAULT_TRANSITIONS, initial_state='disabled', timeout_delay=DEFAULT_TIMEOUT_RETRY, audit_delay=DEFAULT_AUDIT_DELAY): """ Class initialization :param agent: (OpenOmciAgent) Agent :param device_id: (str) ONU Device ID :param db: (MibDbApi) MIB/Alarm Database :param advertise_events: (bool) Advertise events on OpenOMCI Event Bus :param alarm_sync_tasks: (dict) Tasks to run :param states: (list) List of valid states :param transitions: (dict) Dictionary of triggers and state changes :param initial_state: (str) Initial state machine state :param timeout_delay: (int/float) Number of seconds after a timeout to attempt a retry (goes back to starting state) :param audit_delay: (int) Seconds between Alarm audits while in sync. Set to zero to disable audit. An operator can request an audit manually by calling 'self.audit_alarm' """ self.log = structlog.get_logger(device_id=device_id) self._agent = agent self._device_id = device_id self._device = None self._database = db self._timeout_delay = timeout_delay self._audit_delay = audit_delay self._resync_task = alarm_sync_tasks['alarm-resync'] self._advertise_events = advertise_events self._alarm_manager = None self._onu_id = None self._uni_ports = list() self._ani_ports = list() self._serial_number = None self._deferred = None self._current_task = None self._task_deferred = None self._last_alarm_sequence_value = 0 self._device_in_db = False self._event_bus = EventBusClient() self._omci_cc_subscriptions = { # RxEvent.enum -> Subscription Object RxEvent.Get_ALARM_Get: None, RxEvent.Alarm_Notification: None } self._omci_cc_sub_mapping = { RxEvent.Get_ALARM_Get: self.on_alarm_update_response, RxEvent.Alarm_Notification: self.on_alarm_notification } # Statistics and attributes # TODO: add any others if it will support problem diagnosis # Set up state machine to manage states self.machine = Machine(model=self, states=states, transitions=transitions, initial=initial_state, queued=True, name='{}-{}'.format(self.__class__.__name__, device_id))