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()
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)
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()
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()
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)
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