def test_leader(self): core = Mock() store = Mock() def get_terminating(): time.sleep(0.5) return [] def side_effect(event, *args, **kwargs): event.set() nodes_event = threading.Event() ctx_event = threading.Event() store.get_terminating = MagicMock(side_effect=get_terminating) core._get_nodes_by_id = MagicMock(return_value=[]) core.query_nodes = MagicMock(side_effect=partial(side_effect, nodes_event)) core.query_contexts = MagicMock(side_effect=partial(side_effect, ctx_event)) leader = ProvisionerLeader(store, core) leader.initialize() store.contend_leader.assert_called_with(leader) leader_thread = tevent.spawn(leader.inaugurate) # the leader should call core.query_nodes() and core.query_contexts() # wait for that. assert nodes_event.wait(1) assert ctx_event.wait(1) assert core.query_nodes.called assert core.query_contexts.called nodes_event.clear() ctx_event.clear() core.query_nodes.reset() core.query_contexts.reset() # reset and trigger another query cycle (peeking into impl) leader._force_cycle() assert nodes_event.wait(1) assert ctx_event.wait(1) assert core.query_nodes.called assert core.query_contexts.called leader.depose() self.assertFalse(leader.is_leader) leader_thread.join(1) self.assertFalse(leader_thread.is_alive())