コード例 #1
0
ファイル: test_leader.py プロジェクト: oldpatricka/epu
    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())