Commit 0819b2e4 authored by willem's avatar willem
Browse files

Switched to int from void* for peer references

parent 825ca97e
...@@ -20,7 +20,7 @@ typedef struct { ...@@ -20,7 +20,7 @@ typedef struct {
void* inbox; void* inbox;
} sender_t; } sender_t;
int sender_send(void* caller, void* udata, void* peer, const unsigned char* data, int len) int sender_send(void* caller, void* udata, int peer, const unsigned char* data, int len)
{ {
sender_t* me = caller; sender_t* me = caller;
unsigned char * n; unsigned char * n;
......
int sender_send(void* caller, void* udata, void* peer, int sender_send(void* caller, void* udata, int peer,
const unsigned char* data, const int len); const unsigned char* data, const int len);
void* sender_new(); void* sender_new();
......
...@@ -92,7 +92,7 @@ typedef int ( ...@@ -92,7 +92,7 @@ typedef int (
) ( ) (
void *caller, void *caller,
void *udata, void *udata,
void* peer, int peer,
const unsigned char *send_data, const unsigned char *send_data,
const int len const int len
); );
...@@ -151,11 +151,11 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae); ...@@ -151,11 +151,11 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae);
int raft_periodic(raft_server_t* me, int msec_since_last_period); int raft_periodic(raft_server_t* me, int msec_since_last_period);
int raft_recv_appendentries(raft_server_t* me, void* peer, msg_appendentries_t* ae); int raft_recv_appendentries(raft_server_t* me, int peer, msg_appendentries_t* ae);
int raft_recv_requestvote(raft_server_t* me, void* peer, msg_requestvote_t* vr); int raft_recv_requestvote(raft_server_t* me, int peer, msg_requestvote_t* vr);
int raft_recv_requestvote_response(raft_server_t* me, void* peer, msg_requestvote_response_t* r); int raft_recv_requestvote_response(raft_server_t* me, int peer, msg_requestvote_response_t* r);
void raft_execute_command(raft_server_t* me); void raft_execute_command(raft_server_t* me);
...@@ -163,15 +163,15 @@ void raft_set_election_timeout(raft_server_t* me, int millisec); ...@@ -163,15 +163,15 @@ void raft_set_election_timeout(raft_server_t* me, int millisec);
int raft_get_election_timeout(raft_server_t* me); int raft_get_election_timeout(raft_server_t* me);
int raft_vote(raft_server_t* me, void* peer); int raft_vote(raft_server_t* me, int peer);
raft_peer_t* raft_add_peer(raft_server_t* me, void* peer_udata); raft_peer_t* raft_add_peer(raft_server_t* me, int peer_udata);
int raft_remove_peer(raft_server_t* me, void* peer); int raft_remove_peer(raft_server_t* me, int peer);
int raft_get_num_peers(raft_server_t* me); int raft_get_num_peers(raft_server_t* me);
int raft_recv_command(raft_server_t* me, void* peer, msg_command_t* cmd); int raft_recv_command(raft_server_t* me, int peer, msg_command_t* cmd);
int raft_get_log_count(raft_server_t* me); int raft_get_log_count(raft_server_t* me);
...@@ -191,9 +191,9 @@ int raft_is_leader(raft_server_t* me); ...@@ -191,9 +191,9 @@ int raft_is_leader(raft_server_t* me);
int raft_is_candidate(raft_server_t* me); int raft_is_candidate(raft_server_t* me);
int raft_send_requestvote(raft_server_t* me, void* peer); int raft_send_requestvote(raft_server_t* me, int peer);
void raft_send_appendentries(raft_server_t* me, void* peer); void raft_send_appendentries(raft_server_t* me, int peer);
int raft_append_command(raft_server_t* me, unsigned char* data, int len); int raft_append_command(raft_server_t* me, unsigned char* data, int len);
......
...@@ -77,7 +77,10 @@ typedef struct { ...@@ -77,7 +77,10 @@ typedef struct {
/* amount of time left till timeout */ /* amount of time left till timeout */
int timeout_elapased; int timeout_elapased;
hashmap_t* peers; raft_peer_t* peers;
int npeers;
// hashmap_t* peers;
// int log_Size; // int log_Size;
} raft_server_private_t; } raft_server_private_t;
...@@ -106,7 +109,7 @@ raft_server_t* raft_new() ...@@ -106,7 +109,7 @@ raft_server_t* raft_new()
me = calloc(1,sizeof(raft_server_private_t)); me = calloc(1,sizeof(raft_server_private_t));
me->current_index = 0; me->current_index = 0;
me->timeout_elapased = 0; me->timeout_elapased = 0;
me->peers = hashmap_new(__peer_hash, __peer_compare, 100); // me->peers = hashmap_new(__peer_hash, __peer_compare, 100);
return (void*)me; return (void*)me;
} }
...@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_) ...@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_)
void raft_become_candidate(raft_server_t* me_) void raft_become_candidate(raft_server_t* me_)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
hashmap_iterator_t iter; // hashmap_iterator_t iter;
void* p; void* p;
int ii;
me->current_term += 1; me->current_term += 1;
me->voted_for = me; me->voted_for = me;
me->timeout_elapased = 0; me->timeout_elapased = 0;
for (hashmap_iterator(me->peers, &iter); // for (hashmap_iterator(me->peers, &iter);
(p = hashmap_iterator_next_value(me->peers, &iter));) // (p = hashmap_iterator_next_value(me->peers, &iter));)
for (ii=0; ii<me->npeers; ii++)
{ {
msg_requestvote_t rv; msg_requestvote_t rv;
...@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_) ...@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_)
// rv.last_log_index = me->log // rv.last_log_index = me->log
if (me->ext_func && me->ext_func->send) if (me->ext_func && me->ext_func->send)
me->ext_func->send(me->caller,NULL, NULL, (void*)&rv, sizeof(msg_requestvote_t)); me->ext_func->send(me->caller,NULL, ii, (void*)&rv, sizeof(msg_requestvote_t));
} }
} }
...@@ -203,22 +208,22 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period) ...@@ -203,22 +208,22 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
/** /**
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */ * Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
int raft_recv_appendentries(raft_server_t* me_, void* peer, msg_appendentries_t* ae) int raft_recv_appendentries(raft_server_t* me_, int peer, msg_appendentries_t* ae)
{ {
return 0; return 0;
} }
int raft_recv_appendentries_response(raft_server_t* me_, void* peer, msg_appendentries_response_t* ae) int raft_recv_appendentries_response(raft_server_t* me_, int peer, msg_appendentries_response_t* ae)
{ {
return 0; return 0;
} }
int raft_recv_requestvote(raft_server_t* me_, void* peer, msg_requestvote_t* vr) int raft_recv_requestvote(raft_server_t* me_, int peer, msg_requestvote_t* vr)
{ {
return 0; return 0;
} }
int raft_recv_requestvote_response(raft_server_t* me_, void* peer, msg_requestvote_response_t* r) int raft_recv_requestvote_response(raft_server_t* me_, int peer, msg_requestvote_response_t* r)
{ {
return 0; return 0;
} }
...@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_) ...@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_)
return 0; return 0;
} }
int raft_vote(raft_server_t* me_, void* peer) int raft_vote(raft_server_t* me_, int peer)
{ {
return 0; return 0;
} }
raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata) #if 0
raft_peer_t* raft_add_peer(raft_server_t* me_, int peer_udata)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
raft_peer_t* p; raft_peer_t* p;
...@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata) ...@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
return p; return p;
} }
int raft_remove_peer(raft_server_t* me_, void* peer) int raft_remove_peer(raft_server_t* me_, int peer)
{ {
return 0; return 0;
} }
#endif
int raft_get_num_peers(raft_server_t* me_) int raft_get_num_peers(raft_server_t* me_)
{ {
...@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_) ...@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_)
return 0; return 0;
} }
int raft_recv_command(raft_server_t* me_, void* peer, msg_command_t* cmd) int raft_recv_command(raft_server_t* me_, int peer, msg_command_t* cmd)
{ {
return 0; return 0;
} }
...@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_) ...@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_)
return 0; return 0;
} }
int raft_send_requestvote(raft_server_t* me_, void* peer) int raft_send_requestvote(raft_server_t* me_, int peer)
{ {
return 0; return 0;
...@@ -368,12 +375,22 @@ void raft_commit_command(raft_server_t* me_, int logIndex) ...@@ -368,12 +375,22 @@ void raft_commit_command(raft_server_t* me_, int logIndex)
} }
void raft_send_appendentries(raft_server_t* me_, void* peer) void raft_send_appendentries(raft_server_t* me_, int peer)
{ {
} }
void raft_set_configuration(raft_server_t* me_, raft_peer_configuration_t* peers) void raft_set_configuration(raft_server_t* me_, raft_peer_configuration_t* peers)
{ {
raft_server_private_t* me = (void*)me_;
int npeers = 0;
while (peers->udata_address)
{
npeers++;
me->peers = realloc(me->peers,sizeof(raft_peer_t*) * npeers);
me->npeers = npeers;
me->peers[npeers-1] = raft_peer_new(peers);
peers++;
}
} }
...@@ -89,15 +89,15 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe ...@@ -89,15 +89,15 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(CuTest * tc) void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
raft_peer_configuration_t cfg[] = {
/* 2 peers */ /* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1}, {(-1),(void*)1},
{(-1),(void*)2}, {(-1),(void*)2},
{(-1),NULL}}; {(-1),NULL}};
...@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C ...@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
/* three nodes */ raft_set_configuration(r,cfg);
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
raft_periodic(r,1); raft_periodic(r,1);
raft_recv_requestvote_response(r,peer,&vr); raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 0 == raft_is_leader(r)); CuAssertTrue(tc, 0 == raft_is_leader(r));
/* now has majority */ /* now has majority */
raft_recv_requestvote_response(r,peer,&vr); raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
} }
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc) void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_requestvote_response_t vr; msg_requestvote_response_t vr;
memset(&vr,0,sizeof(msg_requestvote_response_t)); memset(&vr,0,sizeof(msg_requestvote_response_t));
...@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc) ...@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
/* three nodes */ raft_set_configuration(r,cfg);
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
raft_recv_requestvote_response(r,peer,&vr); raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 0 == raft_is_leader(r)); CuAssertTrue(tc, 0 == raft_is_leader(r));
/* now has majority */ /* now has majority */
raft_recv_requestvote_response(r,peer,&vr); raft_recv_requestvote_response(r,1,&vr);
CuAssertTrue(tc, 1 == raft_is_leader(r)); CuAssertTrue(tc, 1 == raft_is_leader(r));
} }
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(CuTest * tc) void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg; void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
...@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted( ...@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae; msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
...@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted( ...@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg);
raft_set_election_timeout(r,1000); raft_set_election_timeout(r,1000);
/* three nodes */ /* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
...@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted( ...@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
CuAssertTrue(tc, 0 == raft_is_follower(r)); CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_periodic(r,1); raft_periodic(r,1);
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
} }
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc) void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc) ...@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
}; };
msg_requestvote_t* rv; msg_requestvote_t* rv;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,5); raft_set_current_term(r,5);
raft_set_current_index(r,3); raft_set_current_index(r,3);
raft_send_requestvote(r,peer); raft_send_requestvote(r,1);
rv = sender_poll_msg(sender); rv = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rv); CuAssertTrue(tc, NULL != rv);
...@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc) ...@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest * tc) void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg; void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
...@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest ...@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae; msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1); raft_set_current_term(r,1);
...@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest ...@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
CuAssertTrue(tc, 0 == raft_is_follower(r)); CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_periodic(r,1); raft_periodic(r,1);
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
} }
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower(CuTest * tc) void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae; msg_appendentries_t ae;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* server's log is newer */ /* server's log is newer */
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_current_index(r,2); raft_set_current_index(r,2);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* is a candidate */ /* is a candidate */
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
CuAssertTrue(tc, 0 == raft_is_follower(r)); CuAssertTrue(tc, 0 == raft_is_follower(r));
...@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f ...@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
ae.prev_log_term = 1; ae.prev_log_term = 1;
/* appendentry from invalid leader doesn't make candidate become follower */ /* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_candidate(r)); CuAssertTrue(tc, 1 == raft_is_candidate(r));
} }
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
/* 5.1 */ /* 5.1 */
void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(CuTest * tc) void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
msg_appendentries_t ae; msg_appendentries_t ae;
msg_appendentries_response_t *aer; msg_appendentries_response_t *aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
/* term is low */ /* term is low */
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
...@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */ /* higher current term */
raft_set_current_term(r,5); raft_set_current_term(r,5);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
/* response is false */ /* response is false */
aer = sender_poll_msg(sender); aer = sender_poll_msg(sender);
...@@ -42,22 +49,29 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt ...@@ -42,22 +49,29 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(CuTest * tc) void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(CuTest * tc)
{ {
void *r, *peer; void *r;
msg_appendentries_t ae; msg_appendentries_t ae;
msg_appendentries_response_t *aer; msg_appendentries_response_t *aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* newer term */ /* newer term */
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2; ae.term = 2;
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
/* older currentterm */ /* older currentterm */
raft_set_current_term(r,1); raft_set_current_term(r,1);
/* appendentry has newer term, so we change our currentterm */ /* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 2 == raft_get_current_term(r)); CuAssertTrue(tc, 2 == raft_get_current_term(r));
} }
...@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current ...@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* 5.3 */ /* 5.3 */
void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index(CuTest * tc) void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg; void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae; msg_appendentries_t ae;
msg_appendentries_response_t *aer; msg_appendentries_response_t *aer;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
/* log index that server doesn't have */ /* log index that server doesn't have */
...@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev ...@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
raft_set_current_term(r,5); raft_set_current_term(r,5);
/* trigger reply */ /* trigger reply */
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
aer = sender_poll_msg(sender); aer = sender_poll_msg(sender);
/* reply is false */ /* reply is false */
...@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev ...@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
/* 5.3 */ /* 5.3 */
void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(CuTest * tc) void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(CuTest * tc)
{ {
void *r, *peer; void *r;
msg_appendentries_t ae; msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_current_term(r,2); raft_set_current_term(r,2);
...@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en ...@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2; ae.term = 2;
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
} }
void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuTest * tc) void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT ...@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
}; };
msg_appendentries_t ae; msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* appendentries has multiple entries */ /* appendentries has multiple entries */
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 2; ae.term = 2;
...@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT ...@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 0); CuAssertTrue(tc, 0);
// msg = sender_poll_msg(sender); // msg = sender_poll_msg(sender);
...@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT ...@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
//min(leaderCommit, last log index) //min(leaderCommit, last log index)
void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest * tc) void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest * ...@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
}; };
msg_appendentries_t ae; msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
/* receive an appendentry with commit */ /* receive an appendentry with commit */
...@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest * ...@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
ae.leader_commit = 5; ae.leader_commit = 5;
/* receipt of appendentries changes commit index */ /* receipt of appendentries changes commit index */
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
/* set to 4 because prevLogIdx is lower */ /* set to 4 because prevLogIdx is lower */
CuAssertTrue(tc, 4 == raft_get_commit_index(r)); CuAssertTrue(tc, 4 == raft_get_commit_index(r));
} }
void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest * tc) void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest ...@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
}; };
msg_appendentries_t ae; msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
/* receive an appendentry with commit */ /* receive an appendentry with commit */
...@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest ...@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
ae.leader_commit = 3; ae.leader_commit = 3;
/* receipt of appendentries changes commit index */ /* receipt of appendentries changes commit index */
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
/* set to 3 because leaderCommit is lower */ /* set to 3 because leaderCommit is lower */
CuAssertTrue(tc, 3 == raft_get_commit_index(r)); CuAssertTrue(tc, 3 == raft_get_commit_index(r));
} }
void TestRaft_follower_increases_log_after_appendentry(CuTest * tc) void TestRaft_follower_increases_log_after_appendentry(CuTest * tc)
{ {
void *r, *peer; void *r;
msg_appendentries_t ae; msg_appendentries_t ae;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* appendentry */ /* appendentry */
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_state(r,RAFT_STATE_FOLLOWER); raft_set_state(r,RAFT_STATE_FOLLOWER);
/* log size s */ /* log size s */
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
} }
void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones(CuTest * tc) void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones(CuTest * tc)
{ {
void *r, *peer; void *r;
msg_appendentries_t ae; msg_appendentries_t ae;
r = raft_new(); /* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
/* three nodes */
peer = raft_add_peer(r,(void*)1); r = raft_new();
raft_add_peer(r,(void*)2); raft_set_configuration(r,cfg);
raft_set_current_term(r,1); raft_set_current_term(r,1);
...@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin ...@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
} }
#if 0 #if 0
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc) void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
{ {
void *r, *peer; void *r;
msg_appendentries_t ae; msg_appendentries_t ae;
...@@ -292,16 +346,21 @@ void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * ...@@ -292,16 +346,21 @@ void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest *
void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * tc) void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * tc)
{ {
void *r, *peer; void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
r = raft_new(); r = raft_new();
/* 1 second election timeout */ /* 1 second election timeout */
raft_set_election_timeout(r, 1000); raft_set_election_timeout(r, 1000);
/* three nodes */ raft_set_configuration(r,cfg);
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* 1.001 seconds have passed */ /* 1.001 seconds have passed */
raft_periodic(r, 1001); raft_periodic(r, 1001);
...@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t ...@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t
/* Candidate 5.2 */ /* Candidate 5.2 */
void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTest * tc) void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_requestvote_t rv; msg_requestvote_t rv;
msg_requestvote_response_t *rvr; msg_requestvote_response_t *rvr;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* request vote */ /* request vote */
/* vote indicates candidate's log is not complete compared to follower */ /* vote indicates candidate's log is not complete compared to follower */
...@@ -344,7 +407,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe ...@@ -344,7 +407,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe
raft_set_current_index(r,2); raft_set_current_index(r,2);
/* vote not granted */ /* vote not granted */
raft_recv_requestvote(r,peer,&rv); raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender); rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr); CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted); CuAssertTrue(tc, 0 == rvr->vote_granted);
......
...@@ -19,15 +19,18 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest * ...@@ -19,15 +19,18 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae; msg_appendentries_t* ae;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* three nodes */
raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* candidate to leader */ /* candidate to leader */
raft_set_state(r,RAFT_STATE_CANDIDATE); raft_set_state(r,RAFT_STATE_CANDIDATE);
...@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest * ...@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
/* 5.2 */ /* 5.2 */
void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest * tc) void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest * tc)
{ {
void *r, *peer, *sender; void *r, *sender;
msg_command_response_t *cr; msg_command_response_t *cr;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* I am the leader */ /* I am the leader */
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
...@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest * ...@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
cmd.len = strlen("command"); cmd.len = strlen("command");
/* receive command */ /* receive command */
raft_recv_command(r,peer,&cmd); raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
/* trigger response through commit */ /* trigger response through commit */
...@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest * ...@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
/* 5.3 */ /* 5.3 */
void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(CuTest * tc) void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae; msg_appendentries_t* ae;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* i'm leader */ /* i'm leader */
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r,peer); raft_send_appendentries(r,1);
ae = sender_poll_msg(sender); ae = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
} }
...@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu ...@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
/* 5.3 */ /* 5.3 */
void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency(CuTest * tc) void TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency(CuTest * tc)
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t* ae; msg_appendentries_t* ae;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_configuration(r,cfg);
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
/* i'm leader */ /* i'm leader */
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
/* receive appendentries messages */ /* receive appendentries messages */
raft_send_appendentries(r,peer); raft_send_appendentries(r,1);
ae = sender_poll_msg(sender); ae = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != ae); CuAssertTrue(tc, NULL != ae);
} }
...@@ -146,7 +161,14 @@ set commitIndex = N ( ...@@ -146,7 +161,14 @@ set commitIndex = N (
void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc) void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
{ {
void *r, *peer; void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_command_t cmd; msg_command_t cmd;
cmd.id = 1; cmd.id = 1;
...@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc) ...@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
cmd.len = strlen("command"); cmd.len = strlen("command");
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd); raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
} }
void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc) void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc)
{ {
void *r, *peer; void *r;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_command_t cmd; msg_command_t cmd;
cmd.id = 1; cmd.id = 1;
...@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc ...@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
cmd.len = strlen("command"); cmd.len = strlen("command");
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
CuAssertTrue(tc, 0 == raft_get_log_count(r)); CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd); raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
raft_recv_command(r,peer,&cmd); raft_recv_command(r,1,&cmd);
CuAssertTrue(tc, 1 == raft_get_log_count(r)); CuAssertTrue(tc, 1 == raft_get_log_count(r));
} }
void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry(CuTest * tc) void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry(CuTest * tc)
{ {
void *p1, *p2;
void *r; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
...@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_ ...@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
}; };
msg_appendentries_response_t aer; msg_appendentries_response_t aer;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
raft_set_configuration(r,cfg);
/* 3 nodes */
p1 = raft_add_peer(r,(void*)1);
p2 = raft_add_peer(r,(void*)2);
/* I'm the leader */ /* I'm the leader */
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
...@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_ ...@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
raft_set_commit_index(r,4); raft_set_commit_index(r,4);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_send_appendentries(r, p1); raft_send_appendentries(r, 1);
raft_send_appendentries(r, p2); raft_send_appendentries(r, 2);
/* respond that we have the appendentries */ /* respond that we have the appendentries */
memset(&aer,0,sizeof(msg_appendentries_response_t)); memset(&aer,0,sizeof(msg_appendentries_response_t));
...@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_ ...@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
aer.success = 1; aer.success = 1;
/* announce to leader that the majority have appended this log */ /* announce to leader that the majority have appended this log */
raft_recv_appendentries_response(r,p1,&aer); raft_recv_appendentries_response(r,1,&aer);
raft_recv_appendentries_response(r,p2,&aer); raft_recv_appendentries_response(r,2,&aer);
CuAssertTrue(tc, 5 == raft_get_commit_index(r)); CuAssertTrue(tc, 5 == raft_get_commit_index(r));
} }
void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(CuTest * tc) void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(CuTest * tc)
{ {
void* peer;
void *r; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
.log = NULL .log = NULL
}; };
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
msg_appendentries_t ae; msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t)); memset(&ae,0,sizeof(msg_appendentries_t));
...@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C ...@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_state(r,RAFT_STATE_LEADER); raft_set_state(r,RAFT_STATE_LEADER);
raft_set_current_term(r,5); raft_set_current_term(r,5);
raft_set_current_index(r,5); raft_set_current_index(r,5);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,peer,&ae); raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r)); CuAssertTrue(tc, 1 == raft_is_follower(r));
} }
......
...@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc) ...@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc)
CuAssertTrue(tc, 2 == raft_get_current_term(r)); CuAssertTrue(tc, 2 == raft_get_current_term(r));
} }
void TestRaft_add_peer(CuTest * tc) #if 0
void T_estRaft_add_peer(CuTest * tc)
{ {
void *r; void *r;
...@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc) ...@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r)); CuAssertTrue(tc, 1 == raft_get_num_peers(r));
} }
void TestRaft_dont_add_duplicate_peers(CuTest * tc) void T_estRaft_dont_add_duplicate_peers(CuTest * tc)
{ {
void *r; void *r;
...@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc) ...@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r)); CuAssertTrue(tc, 1 == raft_get_num_peers(r));
} }
void TestRaft_remove_peer(CuTest * tc) void T_estRaft_remove_peer(CuTest * tc)
{ {
void *r; void *r;
void *peer; void *peer;
...@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc) ...@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc)
raft_remove_peer(r,peer); raft_remove_peer(r,peer);
CuAssertTrue(tc, 0 == raft_get_num_peers(r)); CuAssertTrue(tc, 0 == raft_get_num_peers(r));
} }
#endif
void TestRaft_set_state(CuTest * tc) void TestRaft_set_state(CuTest * tc)
{ {
......
...@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term ...@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
CuTest * tc CuTest * tc
) )
{ {
void *r, *peer; void *r;
void *sender; void *sender;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
.send = sender_send, .send = sender_send,
...@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term ...@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
msg_requestvote_t rv; msg_requestvote_t rv;
msg_requestvote_response_t *rvr; msg_requestvote_response_t *rvr;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
memset(&rv,0,sizeof(msg_requestvote_t)); memset(&rv,0,sizeof(msg_requestvote_t));
rv.term = 2; rv.term = 2;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_recv_requestvote(r,peer,&rv); raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender); rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr); CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted); CuAssertTrue(tc, 0 == rvr->vote_granted);
...@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( ...@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest * tc CuTest * tc
) )
{ {
void *r, *peer; void *r;
void *sender; void *sender;
void *msg; void *msg;
raft_external_functions_t funcs = { raft_external_functions_t funcs = {
...@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate( ...@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
msg_requestvote_t rv; msg_requestvote_t rv;
msg_requestvote_response_t *rvr; msg_requestvote_response_t *rvr;
/* 2 peers */
raft_peer_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),NULL}};
memset(&rv,0,sizeof(msg_requestvote_response_t)); memset(&rv,0,sizeof(msg_requestvote_response_t));
rv.term = 1; rv.term = 1;
sender = sender_new(); sender = sender_new();
r = raft_new(); r = raft_new();
peer = raft_add_peer(r,(void*)1); raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender); raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1); raft_set_current_term(r,1);
raft_vote(r,peer); raft_vote(r,1);
raft_recv_requestvote(r,peer,&rv); raft_recv_requestvote(r,1,&rv);
rvr = sender_poll_msg(sender); rvr = sender_poll_msg(sender);
CuAssertTrue(tc, NULL != rvr); CuAssertTrue(tc, NULL != rvr);
CuAssertTrue(tc, 0 == rvr->vote_granted); CuAssertTrue(tc, 0 == rvr->vote_granted);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment