Commit e62f254f authored by willem's avatar willem
Browse files

Added scenario tests

parent b98eedcb
...@@ -121,7 +121,7 @@ CuTest* CuTestNew(const char* name, TestFunction function) ...@@ -121,7 +121,7 @@ CuTest* CuTestNew(const char* name, TestFunction function)
void CuTestRun(CuTest* tc) void CuTestRun(CuTest* tc)
{ {
#if 1 /* debugging */ #if 0 /* debugging */
printf(" running %s\n", tc->name); printf(" running %s\n", tc->name);
#endif #endif
jmp_buf buf; jmp_buf buf;
......
...@@ -195,6 +195,8 @@ int raft_send_requestvote(raft_server_t* me, int node); ...@@ -195,6 +195,8 @@ int raft_send_requestvote(raft_server_t* me, int node);
void raft_send_appendentries(raft_server_t* me, int node); void raft_send_appendentries(raft_server_t* me, int node);
void raft_send_appendentries_all(raft_server_t* me_);
int raft_append_entry(raft_server_t* me_, raft_entry_t* c); int raft_append_entry(raft_server_t* me_, raft_entry_t* c);
int raft_get_timeout_elapsed(raft_server_t* me); int raft_get_timeout_elapsed(raft_server_t* me);
...@@ -229,3 +231,4 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int idx); ...@@ -229,3 +231,4 @@ raft_entry_t* raft_get_entry_from_idx(raft_server_t* me_, int idx);
raft_node_t* raft_get_node(raft_server_t *me_, int nodeid); raft_node_t* raft_get_node(raft_server_t *me_, int nodeid);
int raft_get_nodeid(raft_server_t* me_); int raft_get_nodeid(raft_server_t* me_);
...@@ -108,7 +108,7 @@ static void __log(raft_server_t *me_, void *src, const char *fmt, ...) ...@@ -108,7 +108,7 @@ static void __log(raft_server_t *me_, void *src, const char *fmt, ...)
va_start(args, fmt); va_start(args, fmt);
vsprintf(buf, fmt, args); vsprintf(buf, fmt, args);
printf("%d: %s\n", me->nodeid, buf); //printf("%d: %s\n", me->nodeid, buf);
//__FUNC_log(bto,src,buf); //__FUNC_log(bto,src,buf);
} }
...@@ -125,8 +125,8 @@ raft_server_t* raft_new() ...@@ -125,8 +125,8 @@ raft_server_t* raft_new()
me->timeout_elapsed = 0; me->timeout_elapsed = 0;
me->log = log_new(); me->log = log_new();
raft_set_state((void*)me,RAFT_STATE_FOLLOWER); raft_set_state((void*)me,RAFT_STATE_FOLLOWER);
raft_set_request_timeout((void*)me, 500); me->request_timeout = 200;
raft_set_election_timeout((void*)me, 1000); me->election_timeout = 1000;
return (void*)me; return (void*)me;
} }
...@@ -355,6 +355,8 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period) ...@@ -355,6 +355,8 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
{ {
raft_server_private_t* me = (void*)me_; raft_server_private_t* me = (void*)me_;
__log(me_, NULL, "periodic elapsed time: %d", me->timeout_elapsed);
switch (me->state) switch (me->state)
{ {
case RAFT_STATE_FOLLOWER: case RAFT_STATE_FOLLOWER:
...@@ -366,9 +368,18 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period) ...@@ -366,9 +368,18 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
break; break;
} }
if (me->state != RAFT_STATE_LEADER) me->timeout_elapsed += msec_since_last_period;
if (me->state == RAFT_STATE_LEADER)
{
if (me->request_timeout <= me->timeout_elapsed)
{
raft_send_appendentries_all(me_);
me->timeout_elapsed = 0;
}
}
else
{ {
me->timeout_elapsed += msec_since_last_period;
if (me->election_timeout <= me->timeout_elapsed) if (me->election_timeout <= me->timeout_elapsed)
{ {
raft_election_start(me_); raft_election_start(me_);
...@@ -755,6 +766,18 @@ void raft_send_appendentries(raft_server_t* me_, int node) ...@@ -755,6 +766,18 @@ void raft_send_appendentries(raft_server_t* me_, int node)
(void*)&ae, sizeof(msg_appendentries_t)); (void*)&ae, sizeof(msg_appendentries_t));
} }
void raft_send_appendentries_all(raft_server_t* me_)
{
raft_server_private_t* me = (void*)me_;
int i;
for (i=0; i<me->nnodes; i++)
{
if (me->nodeid == i) continue;
raft_send_appendentries(me_, i);
}
}
/** /**
* Set configuration * Set configuration
* @param nodes Array of nodes, end of array is marked by NULL entry * @param nodes Array of nodes, end of array is marked by NULL entry
......
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "CuTest.h"
#include "raft.h"
#include "mock_send_functions.h"
void TestRaft_scenario_leader_appears(CuTest * tc)
{
int i,j;
raft_server_t *r[3];
void* sender[3];
raft_node_configuration_t cfg[] = {
{(-1),(void*)1},
{(-1),(void*)2},
{(-1),(void*)3},
{(-1),NULL}};
senders_new();
for (j=0;j<3;j++)
{
r[j] = raft_new();
sender[j] = sender_new(cfg[j].udata_address);
sender_set_raft(sender[j], r[j]);
raft_set_election_timeout(r[j], 500);
raft_set_configuration(r[j],cfg,j);
raft_set_callbacks(r[j],&((raft_cbs_t) {
.send = sender_send,
.log = NULL
}), sender[j]);
}
for (i=0;i<20;i++)
{
one_more_time:
for (j=0;j<3;j++)
sender_poll_msgs(sender[j]);
for (j=0;j<3;j++)
if (sender_msgs_available(sender[j]))
goto one_more_time;
for (j=0;j<3;j++)
raft_periodic(r[j], 100);
}
int leaders = 0;
for (j=0;j<3;j++)
{
if (raft_is_leader(r[j]))
leaders += 1;
}
CuAssertTrue(tc, 0 != leaders);
CuAssertTrue(tc, 1 == leaders);
}
...@@ -123,12 +123,12 @@ void TestRaft_server_starts_with_election_timeout_of_1000ms(CuTest * tc) ...@@ -123,12 +123,12 @@ void TestRaft_server_starts_with_election_timeout_of_1000ms(CuTest * tc)
CuAssertTrue(tc, 1000 == raft_get_election_timeout(r)); CuAssertTrue(tc, 1000 == raft_get_election_timeout(r));
} }
void TestRaft_server_starts_with_request_timeout_of_500ms(CuTest * tc) void TestRaft_server_starts_with_request_timeout_of_200ms(CuTest * tc)
{ {
void *r; void *r;
r = raft_new(); r = raft_new();
CuAssertTrue(tc, 500 == raft_get_request_timeout(r)); CuAssertTrue(tc, 200 == raft_get_request_timeout(r));
} }
void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc) void TestRaft_server_entry_append_cant_append_if_id_is_zero(CuTest* tc)
......
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