Commit 64bdc559 authored by willem's avatar willem
Browse files

More test cases passing

parent 24f6666a
......@@ -173,6 +173,8 @@ void raft_become_candidate(raft_server_t* me_)
me->voted_for = 0;
me->timeout_elapased = 0;
raft_set_state(me_,RAFT_STATE_CANDIDATE);
// for (hashmap_iterator(me->peers, &iter);
// (p = hashmap_iterator_next_value(me->peers, &iter));)
for (ii=0; ii<me->npeers; ii++)
......@@ -189,6 +191,11 @@ void raft_become_candidate(raft_server_t* me_)
}
void raft_become_follower(raft_server_t* me_)
{
raft_set_state(me_,RAFT_STATE_FOLLOWER);
}
/**
* Convert to candidate if election timeout elapses without either
* Receiving valid AppendEntries RPC, or
......@@ -228,8 +235,38 @@ 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). */
int raft_recv_appendentries(raft_server_t* me_, int peer, msg_appendentries_t* ae)
int raft_recv_appendentries(raft_server_t* me_, const int peer, msg_appendentries_t* ae)
{
raft_server_private_t* me = (void*)me_;
msg_appendentries_response_t r;
r.term = raft_get_current_term(me_);
if (
ae->term < raft_get_current_term(me_) ||
ae->prev_log_index < raft_get_current_index(me_))
{
r.success = 0;
}
else
{
if (raft_is_candidate(me_))
{
raft_become_follower(me_);
}
if (raft_get_current_term(me_) < ae->term)
{
raft_set_current_term(me_,ae->term);
}
r.success = 1;
}
if (me->ext_func && me->ext_func->send)
me->ext_func->send(me->caller, NULL, peer, (void*)&r,
sizeof(msg_appendentries_response_t));
return 0;
}
......@@ -392,8 +429,7 @@ int raft_get_current_index(raft_server_t* me_)
int raft_is_follower(raft_server_t* me_)
{
return 0;
return raft_get_state(me_) == RAFT_STATE_FOLLOWER;
}
int raft_is_leader(raft_server_t* me_)
......@@ -403,8 +439,7 @@ int raft_is_leader(raft_server_t* me_)
int raft_is_candidate(raft_server_t* me_)
{
return 0;
return raft_get_state(me_) == RAFT_STATE_CANDIDATE;
}
int raft_get_my_id(raft_server_t* me_)
......
......@@ -9,6 +9,16 @@
#include "raft.h"
#include "mock_send_functions.h"
void TestRaft_candidate_becomes_candidate_is_candidate(CuTest * tc)
{
void *r;
r = raft_new();
raft_become_candidate(r);
CuAssertTrue(tc, raft_is_candidate(r));
}
/* Candidate 5.2 */
void TestRaft_follower_becoming_candidate_increments_current_term(CuTest * tc)
{
......@@ -269,12 +279,10 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
r = raft_new();
raft_set_configuration(r,cfg);
raft_set_external_functions(r,&funcs,sender);
raft_set_current_term(r,1);
raft_set_state(r,RAFT_STATE_CANDIDATE);
CuAssertTrue(tc, raft_get_my_id(r) == raft_is_follower(r));
raft_periodic(r,1);
CuAssertTrue(tc, 0 == raft_is_follower(r));
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r));
......
......@@ -9,6 +9,17 @@
#include "raft.h"
#include "mock_send_functions.h"
void TestRaft_follower_becomes_follower_is_follower(CuTest * tc)
{
void *r;
r = raft_new();
raft_become_follower(r);
CuAssertTrue(tc, raft_is_follower(r));
}
/* 5.1 */
void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm(CuTest * tc)
{
......@@ -28,9 +39,10 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
{(-1),NULL}};
sender = sender_new();
r = raft_new();
raft_set_configuration(r,cfg);
sender = sender_new();
raft_set_external_functions(r,&funcs,sender);
/* term is low */
memset(&ae,0,sizeof(msg_appendentries_t));
......@@ -38,7 +50,6 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */
raft_set_current_term(r,5);
raft_set_external_functions(r,&funcs,sender);
raft_recv_appendentries(r,1,&ae);
/* response is false */
......@@ -47,6 +58,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
CuAssertTrue(tc, 0 == aer->success);
}
/* TODO: check if test case is needed */
void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm(CuTest * tc)
{
void *r;
......@@ -73,11 +85,10 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 2 == raft_get_current_term(r));
}
/* 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_which_matches_prev_log_term(CuTest * tc)
{
void *r;
void *sender;
......
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