Commit 9f2fb73a authored by willem's avatar willem
Browse files

Passing unit tests

parent 37bbc66b
......@@ -121,7 +121,7 @@ CuTest* CuTestNew(const char* name, TestFunction function)
void CuTestRun(CuTest* tc)
{
#if 1 /* debugging */
#if 0 /* debugging */
printf(" running %s\n", tc->name);
#endif
jmp_buf buf;
......
......@@ -111,6 +111,7 @@ int log_append_entry(log_t* me_, raft_entry_t* c)
// return 0;
memcpy(&me->entries[me->back],c,sizeof(raft_entry_t));
me->entries[me->back].npeers = 0;
me->count++;
me->back++;
return 1;
......@@ -225,5 +226,12 @@ void log_free(log_t * me_)
void log_mark_peer_has_committed(log_t* me_, int idx)
{
log_private_t* me = (void*)me_;
raft_entry_t* e;
if ((e = log_get_from_idx(me_,idx)))
{
e->npeers += 1;
}
}
......@@ -106,7 +106,7 @@ static void __log(raft_server_t *me_, void *src, const char *fmt, ...)
va_start(args, fmt);
vsprintf(buf, fmt, args);
printf("%s\n", buf);
//printf("%s\n", buf);
//__FUNC_log(bto,src,buf);
}
......@@ -348,8 +348,8 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
case RAFT_STATE_FOLLOWER:
if (me->last_applied_idx < me->commit_idx)
{
// if (0 == raft_apply_entry(me_))
// return 0;
if (0 == raft_apply_entry(me_))
return 0;
}
break;
}
......@@ -381,7 +381,7 @@ int raft_recv_appendentries_response(raft_server_t* me_,
{
int i;
for (i=aer->first_idx; i<aer->current_idx; i++)
for (i=aer->first_idx; i<=aer->current_idx; i++)
log_mark_peer_has_committed(me->log, i);
while (1)
......@@ -390,13 +390,9 @@ int raft_recv_appendentries_response(raft_server_t* me_,
e = log_get_from_idx(me->log, me->last_applied_idx + 1);
if (e)
printf("comparing %d to %d\n", me->npeers / 2, e->npeers);
/* majority has this */
if (e && me->npeers / 2 <= e->npeers)
{
printf("applying entry\n");
if (0 == raft_apply_entry(me_)) break;
}
else
......@@ -429,10 +425,14 @@ int raft_recv_appendentries(
raft_server_private_t* me = (void*)me_;
msg_appendentries_response_t r;
r.term = raft_get_current_term(me_);
r.term = me->current_term;
/* we've found a leader who is legitimate */
if (raft_is_leader(me_) && me->current_term <= ae->term)
raft_become_follower(me_);
/* 1. Reply false if term < currentTerm (5.1) */
if (ae->term < raft_get_current_term(me_))
if (ae->term < me->current_term)
{
__log(me_, NULL, "AE term is less than current term");
r.success = 0;
......@@ -672,7 +672,7 @@ int raft_apply_entry(raft_server_t* me_)
{
raft_server_private_t* me = (void*)me_;
if (!log_get_from_idx(me->log, me->commit_idx+1))
if (!log_get_from_idx(me->log, me->last_applied_idx+1))
return 0;
me->last_applied_idx++;
......
......@@ -59,6 +59,21 @@ void TestLog_get_at_idx_returns_null_where_out_of_bounds(CuTest * tc)
CuAssertTrue(tc, NULL == log_get_from_idx(l,2));
}
void TestLog_mark_peer_has_committed_adds_peers(CuTest * tc)
{
void *l;
raft_entry_t e1, e2, e3;
l = log_new();
e1.id = 1;
log_append_entry(l, &e1);
CuAssertTrue(tc, 0 == log_get_from_idx(l,1)->npeers);
log_mark_peer_has_committed(l, 1);
CuAssertTrue(tc, 1 == log_get_from_idx(l,1)->npeers);
log_mark_peer_has_committed(l, 1);
CuAssertTrue(tc, 2 == log_get_from_idx(l,1)->npeers);
}
void TestLog_delete(CuTest * tc)
{
void *l;
......
......@@ -257,7 +257,8 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(CuTest*
r = raft_new();
/* must be follower */
raft_set_state(r,RAFT_STATE_FOLLOWER);
raft_set_commit_idx(r,1);
raft_set_current_term(r, 1);
raft_set_commit_idx(r, 1);
raft_set_last_applied_idx(r, 0);
/* need at least one entry */
......@@ -269,6 +270,7 @@ void TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitidx(CuTest*
/* let time lapse */
raft_periodic(r,1);
CuAssertTrue(tc, 0 != raft_get_last_applied_idx(r));
CuAssertTrue(tc, 1 == raft_get_last_applied_idx(r));
}
......@@ -925,7 +927,6 @@ void TestRaft_follower_recv_appendentries_set_commitidx_to_prevLogIdx(CuTest * t
CuAssertTrue(tc, NULL != aer);
CuAssertTrue(tc, 1 == aer->success);
/* set to 4 because commitIDX is lower */
printf("%d\n", raft_get_commit_idx(r));
CuAssertTrue(tc, 4 == raft_get_commit_idx(r));
}
......@@ -1711,7 +1712,6 @@ void TestRaft_leader_increase_commit_idx_when_majority_have_entry_and_atleast_on
/* I'm the leader */
raft_set_state(r,RAFT_STATE_LEADER);
raft_set_current_term(r,1);
raft_set_current_idx(r,0);
raft_set_commit_idx(r,0);
/* the last applied idx will became 1, and then 2 */
raft_set_last_applied_idx(r,0);
......@@ -1741,8 +1741,8 @@ void TestRaft_leader_increase_commit_idx_when_majority_have_entry_and_atleast_on
raft_recv_appendentries_response(r,1,&aer);
raft_recv_appendentries_response(r,2,&aer);
/* leader will now have majority followers who have appended this log */
printf("last applied idx: %d\n", raft_get_last_applied_idx(r));
printf("commit idx: %d\n", raft_get_commit_idx(r));
CuAssertTrue(tc, 0 != raft_get_commit_idx(r));
CuAssertTrue(tc, 2 != raft_get_commit_idx(r));
CuAssertTrue(tc, 1 == raft_get_commit_idx(r));
CuAssertTrue(tc, 1 == raft_get_last_applied_idx(r));
......@@ -1759,8 +1759,6 @@ void TestRaft_leader_increase_commit_idx_when_majority_have_entry_and_atleast_on
raft_recv_appendentries_response(r,1,&aer);
raft_recv_appendentries_response(r,2,&aer);
/* leader will now have majority followers who have appended this log */
printf("last applied idx: %d\n", raft_get_last_applied_idx(r));
printf("commit idx: %d\n", raft_get_commit_idx(r));
CuAssertTrue(tc, 2 == raft_get_commit_idx(r));
CuAssertTrue(tc, 2 == raft_get_last_applied_idx(r));
}
......@@ -1782,10 +1780,6 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
msg_appendentries_t ae;
memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 5;
ae.prev_log_idx = 6;
ae.prev_log_term = 5;
sender = sender_new();
r = raft_new();
......@@ -1795,6 +1789,11 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
raft_set_current_term(r,5);
raft_set_current_idx(r,5);
raft_set_callbacks(r,&funcs,sender);
memset(&ae,0,sizeof(msg_appendentries_t));
ae.term = 5;
ae.prev_log_idx = 6;
ae.prev_log_term = 5;
raft_recv_appendentries(r,1,&ae);
CuAssertTrue(tc, 1 == raft_is_follower(r));
......@@ -1802,7 +1801,6 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
/* TODO: If a server receives a request with a stale term number, it rejects the request. */
#if 0
void T_estRaft_leader_sends_appendentries_when_receive_entry_msg(CuTest * tc)
#endif
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