Esempio n. 1
0
    def test_process_request_vote_stale_term(self):

        ae_req_message = (-1, 2, 3)
        self.server._process_request_vote("peer_id", *ae_req_message)
        rv_response_ko = message.build_request_vote_response(
            self.server._server_state.term(), False)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response_ko)
        self.server._remote_peers.reset_mock()
Esempio n. 2
0
    def test_process_request_vote_stale_term(self):

        ae_req_message = (-1, 2, 3)
        self.server._process_request_vote("peer_id", *ae_req_message)
        rv_response_ko = message.build_request_vote_response(
            self.server._server_state.term(), False)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response_ko)
        self.server._remote_peers.reset_mock()
Esempio n. 3
0
    def _process_request_vote(self, candidate_id, candidate_term,
                              last_log_index, last_log_term):
        """Processes the request vote request.

        :param candidate_id: The identifier of the remote peer in the form of
        "address ip:port".
        :type candidate_id: str
        :param candidate_term: Term of the candidate peer.
        :type candidate_term: int
        :param last_log_index: Last log index of the candidate peer.
        :type last_log_index: int
        :param last_log_term: Last log term of the candidate peer.
        :type last_log_term: int
        """

        # Received a stale request then respond negatively.
        if self._server_state.term() > candidate_term:
            LOG.debug("request vote denied to '%s', stale term" % candidate_id)
            rv_response_ko = message.build_request_vote_response(
                self._server_state.term(), False)
            self._remote_peers[candidate_id].send_message(rv_response_ko)
            return

        # The current server is outdated then switch to follower.
        if self._server_state.term() < candidate_term:
            LOG.debug("process rv server outdated, switch to follower")
            self._server_state.switch_to_follower(candidate_term, None)

        vote = False
        if self._is_candidate_log_up_to_date(last_log_index, last_log_term):
            if self._server_state.grant_vote(candidate_id):
                vote = True

        LOG.debug("send request vote response '%s' to '%s" % (vote,
                                                              candidate_id))
        rv_response = message.build_request_vote_response(
            self._server_state.term(), vote)
        self._remote_peers[candidate_id].send_message(rv_response)
Esempio n. 4
0
    def test_process_request_vote_deny_vote(self):

        ae_req_message = (0, 1, 1)
        self.server._is_candidate_log_up_to_date = mock.Mock()
        self.server._is_candidate_log_up_to_date.return_value = True
        self.server._server_state.grant_vote = mock.Mock()
        self.server._server_state.grant_vote.return_value = False
        self.server._process_request_vote("peer_id", *ae_req_message)

        rv_response_ko = message.build_request_vote_response(
            self.server._server_state.term(), False)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response_ko)
        self.server._remote_peers["peer_id"].reset_mock()
Esempio n. 5
0
    def test_process_request_vote_deny_vote(self):

        ae_req_message = (0, 1, 1)
        self.server._is_candidate_log_up_to_date = mock.Mock()
        self.server._is_candidate_log_up_to_date.return_value = True
        self.server._server_state.grant_vote = mock.Mock()
        self.server._server_state.grant_vote.return_value = False
        self.server._process_request_vote("peer_id", *ae_req_message)

        rv_response_ko = message.build_request_vote_response(
            self.server._server_state.term(), False)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response_ko)
        self.server._remote_peers["peer_id"].reset_mock()
Esempio n. 6
0
    def test_process_request_vote_outdated_term_grant_vote(self):

        ae_req_message = (2, 2, 3)
        self.server._server_state.switch_to_follower = mock.Mock()
        self.server._is_candidate_log_up_to_date = mock.Mock()
        self.server._is_candidate_log_up_to_date.return_value = True
        self.server._server_state.grant_vote = mock.Mock()
        self.server._server_state.grant_vote.return_value = True
        self.server._process_request_vote("peer_id", *ae_req_message)

        rv_response = message.build_request_vote_response(
            self.server._server_state.term(), True)
        self.server._server_state.switch_to_follower.\
            assert_called_once_with(2, None)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response)
        self.server._remote_peers["peer_id"].reset_mock()
        self.server._server_state.switch_to_follower.reset_mock()
Esempio n. 7
0
    def test_process_request_vote_outdated_term_grant_vote(self):

        ae_req_message = (2, 2, 3)
        self.server._server_state.switch_to_follower = mock.Mock()
        self.server._is_candidate_log_up_to_date = mock.Mock()
        self.server._is_candidate_log_up_to_date.return_value = True
        self.server._server_state.grant_vote = mock.Mock()
        self.server._server_state.grant_vote.return_value = True
        self.server._process_request_vote("peer_id", *ae_req_message)

        rv_response = message.build_request_vote_response(
            self.server._server_state.term(), True)
        self.server._server_state.switch_to_follower.\
            assert_called_once_with(2, None)
        self.server._remote_peers["peer_id"].send_message.\
            assert_called_once_with(rv_response)
        self.server._remote_peers["peer_id"].reset_mock()
        self.server._server_state.switch_to_follower.reset_mock()
Esempio n. 8
0
    def test_process_internal_raft_message(self):

        self.server._process_append_entry_request = mock.Mock()
        self.server._process_append_entry_response = mock.Mock()
        self.server._process_request_vote = mock.Mock()
        self.server._process_request_vote_response = mock.Mock()
        mock_socket = mock.Mock(spec=zmq.sugar.socket.Socket)

        # Append entry request.
        aereq = (1, 2, 3, 4, ())
        aereq_packed = message.build_append_entry_request(*aereq)
        mock_socket.recv_multipart.return_value = ("identifier", aereq_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_append_entry_request.assert_called_once_with(
            "identifier", *aereq)

        # Append entry response.
        aeresp = (1, True, 0, None)
        aeresp_packed = message.build_append_entry_response(*aeresp)
        mock_socket.recv_multipart.return_value = ("identifier", aeresp_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_append_entry_response.\
            assert_called_once_with("identifier", *aeresp)

        # Request vote.
        rv = (1, 2, 3)
        rv_packed = message.build_request_vote(*rv)
        mock_socket.recv_multipart.return_value = ("identifier", rv_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_request_vote.assert_called_once_with(
            "identifier", *rv)

        # Request vote response.
        rvresp = (0, False)
        rvresp_packed = message.build_request_vote_response(*rvresp)
        mock_socket.recv_multipart.return_value = ("identifier", rvresp_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_request_vote_response.\
            assert_called_once_with("identifier", *rvresp)
Esempio n. 9
0
    def test_process_internal_raft_message(self):

        self.server._process_append_entry_request = mock.Mock()
        self.server._process_append_entry_response = mock.Mock()
        self.server._process_request_vote = mock.Mock()
        self.server._process_request_vote_response = mock.Mock()
        mock_socket = mock.Mock(spec=zmq.sugar.socket.Socket)

        # Append entry request.
        aereq = (1, 2, 3, 4, ())
        aereq_packed = message.build_append_entry_request(*aereq)
        mock_socket.recv_multipart.return_value = ("identifier", aereq_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_append_entry_request.assert_called_once_with(
            "identifier", *aereq)

        # Append entry response.
        aeresp = (1, True, 0, None)
        aeresp_packed = message.build_append_entry_response(*aeresp)
        mock_socket.recv_multipart.return_value = ("identifier", aeresp_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_append_entry_response.\
            assert_called_once_with("identifier", *aeresp)

        # Request vote.
        rv = (1, 2, 3)
        rv_packed = message.build_request_vote(*rv)
        mock_socket.recv_multipart.return_value = ("identifier", rv_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_request_vote.assert_called_once_with(
            "identifier", *rv)

        # Request vote response.
        rvresp = (0, False)
        rvresp_packed = message.build_request_vote_response(*rvresp)
        mock_socket.recv_multipart.return_value = ("identifier", rvresp_packed)
        self.server._process_internal_message(mock_socket, zmq.POLLIN)
        self.server._process_request_vote_response.\
            assert_called_once_with("identifier", *rvresp)
Esempio n. 10
0
def test_build_request_vote_response():
    test_params = (0, False)
    rvr_message = message.build_request_vote_response(*test_params)
    decoded_message = message.decode_message(rvr_message)
    assert (message.REQUEST_VOTE_RESPONSE, test_params) == decoded_message