From 2a10b1d5c48341c9087e1a577d21df1f51703fc4 Mon Sep 17 00:00:00 2001 From: Willem Thiart Date: Tue, 20 Sep 2016 13:46:14 +0100 Subject: [PATCH] Fixes #29 --- tests/test_server.c | 61 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/tests/test_server.c b/tests/test_server.c index 46cc76a7..746f914e 100644 --- a/tests/test_server.c +++ b/tests/test_server.c @@ -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) {