Commit 2a10b1d5 authored by Willem Thiart's avatar Willem Thiart
Browse files

Fixes #29

parent f2ee69fa
......@@ -982,7 +982,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
CuAssertTrue(tc, 0 == aer.success);
}
static raft_entry_t* __entries_for_conflict_tests(
static raft_entry_t* __create_mock_entries_for_conflict_tests(
CuTest * tc,
raft_server_t* r,
char** strs)
......@@ -999,7 +999,7 @@ static raft_entry_t* __entries_for_conflict_tests(
raft_append_entry(r, &ety);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
/* this log will be overwritten by the appendentries below */
/* this log will be overwritten by a later appendentries */
char *str2 = strs[1];
ety.data.buf = str2;
ety.data.len = 3;
......@@ -1010,7 +1010,7 @@ static raft_entry_t* __entries_for_conflict_tests(
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 2)));
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, str2, 3));
/* this log will be overwritten by the appendentries below */
/* this log will be overwritten by a later appendentries */
char *str3 = strs[2];
ety.data.buf = str3;
ety.data.len = 3;
......@@ -1025,7 +1025,7 @@ static raft_entry_t* __entries_for_conflict_tests(
}
/* 5.3 */
void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries(
void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries_via_prev_log_idx(
CuTest * tc)
{
msg_appendentries_t ae;
......@@ -1038,13 +1038,14 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
raft_set_current_term(r, 1);
char* strs[] = {"111", "222", "333"};
raft_entry_t *ety_appended = __entries_for_conflict_tests(tc, r, strs);
raft_entry_t *ety_appended = __create_mock_entries_for_conflict_tests(tc, r, strs);
/* pass a appendentry that is newer */
msg_entry_t mety = {};
memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 2;
/* entries from 2 onwards will be overwritten by this appendentries message */
ae.prev_log_idx = 1;
ae.prev_log_term = 1;
/* include one entry */
......@@ -1059,8 +1060,52 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 2 == raft_get_log_count(r));
/* str1 is still there */
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1)));
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, strs[0], 3));
/* str4 has overwritten the last 2 entries */
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 2)));
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, str4, 3));
}
void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries_via_prev_log_idx_at_idx_0(
CuTest * tc)
{
msg_appendentries_t ae;
msg_appendentries_response_t aer;
void *r = raft_new();
raft_add_node(r, NULL, 1, 1);
raft_add_node(r, NULL, 2, 0);
raft_set_current_term(r, 1);
char* strs[] = {"111", "222", "333"};
raft_entry_t *ety_appended = __create_mock_entries_for_conflict_tests(tc, r, strs);
/* pass a appendentry that is newer */
msg_entry_t mety = {};
memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 2;
/* ALL append entries will be overwritten by this appendentries message */
ae.prev_log_idx = 0;
ae.prev_log_term = 0;
/* include one entry */
memset(&mety, 0, sizeof(msg_entry_t));
char *str4 = "444";
mety.data.buf = str4;
mety.data.len = 3;
mety.id = 4;
ae.entries = &mety;
ae.n_entries = 1;
raft_recv_appendentries(r, raft_get_node(r, 2), &ae, &aer);
CuAssertTrue(tc, 1 == aer.success);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
/* str1 is gone */
CuAssertTrue(tc, NULL != (ety_appended = raft_get_entry_from_idx(r, 1)));
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, str4, 3));
}
void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_than_prev_log_idx(
......@@ -1076,7 +1121,9 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_
raft_set_current_term(r, 1);
char* strs[] = {"111", "222", "333"};
raft_entry_t *ety_appended = __entries_for_conflict_tests(tc, r, strs);
raft_entry_t *ety_appended;
__create_mock_entries_for_conflict_tests(tc, r, strs);
memset(&ae, 0, sizeof(msg_appendentries_t));
ae.term = 2;
......@@ -1092,6 +1139,8 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_current_idx_greater_
CuAssertTrue(tc, !strncmp(ety_appended->data.buf, strs[0], 3));
}
// TODO: add TestRaft_follower_recv_appendentries_delete_entries_if_term_is_different
void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(
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