Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
47472f6e
Commit
47472f6e
authored
Sep 19, 2013
by
willem
Browse files
Finished writing tests
parent
dc4fc5f7
Changes
9
Hide whitespace changes
Inline
Side-by-side
Makefile
View file @
47472f6e
...
...
@@ -36,7 +36,7 @@ main_test.c:
fi
sh make-tests.sh
"test_*.c"
>
main_test.c
tests_main
:
main_test.c raft_server.c raft_candidate.c raft_follower.c raft_leader.c test_server.c test_server_request_vote.c test_follower.c test_candidate.c test_leader.c mock_send_functions.c CuTest.c $(HASHMAP_DIR)/linked_list_hashmap.c $(LLQUEUE_DIR)/linked_list_queue.c
tests_main
:
main_test.c raft_server.c raft_candidate.c raft_follower.c raft_leader.c
raft_peer.c
test_server.c test_server_request_vote.c test_follower.c test_candidate.c test_leader.c
test_peer.c
mock_send_functions.c CuTest.c $(HASHMAP_DIR)/linked_list_hashmap.c $(LLQUEUE_DIR)/linked_list_queue.c
$(CC)
$(CCFLAGS)
-o
$@
$^
./tests_main
...
...
raft.h
View file @
47472f6e
...
...
@@ -34,6 +34,11 @@ typedef struct {
unsigned
int
len
;
}
msg_command_t
;
typedef
struct
{
unsigned
int
id
;
int
wasCommitted
;
}
msg_command_response_t
;
typedef
struct
{
/* currentTerm, for candidate to update itself */
int
term
;
...
...
@@ -78,15 +83,24 @@ typedef void (
)
(
void
*
udata
,
void
*
src
,
// bt_peer_t * peer,
const
char
*
buf
,
...
);
#endif
typedef
int
(
*
func_applylog_f
)
(
void
*
caller
,
void
*
udata
,
const
unsigned
char
*
data
,
const
int
len
);
typedef
struct
{
func_send_f
send
;
func_log_f
log
;
func_applylog_f
applylog
;
}
raft_external_functions_t
;
...
...
@@ -189,5 +203,23 @@ int raft_is_candidate(void* me_);
int
raft_send_requestvote
(
void
*
me_
,
void
*
peer
);
void
raft_send_appendentries
(
void
*
me_
,
void
*
peer
);
int
raft_append_command
(
void
*
me_
,
unsigned
char
*
data
,
int
len
);
void
raft_commit_command
(
void
*
me_
,
int
logIndex
);
void
*
raft_peer_new
();
int
raft_peer_is_leader
(
void
*
peer
);
int
raft_peer_get_next_index
(
void
*
peer
);
void
raft_peer_set_next_index
(
void
*
peer
,
int
nextIdx
);
void
raft_set_commit_index
(
void
*
me_
,
int
commit_idx
);
void
raft_set_lastapplied_index
(
void
*
me_
,
int
idx
);
int
raft_get_lastapplied_index
(
void
*
me_
);
raft_peer.c
0 → 100644
View file @
47472f6e
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "raft.h"
typedef
struct
{
int
pass
;
}
raft_peer_t
;
void
*
raft_peer_new
()
{
return
NULL
;
}
int
raft_peer_is_leader
(
void
*
peer
)
{
return
0
;
}
int
raft_peer_get_next_index
(
void
*
peer
)
{
return
0
;
}
void
raft_peer_set_next_index
(
void
*
peer
,
int
nextIdx
)
{
}
raft_server.c
View file @
47472f6e
...
...
@@ -144,11 +144,20 @@ void raft_set_election_timeout(void* me_, int millisec)
{
}
void
raft_set_request_timeout
(
void
*
me_
,
int
millisec
)
{
}
int
raft_get_election_timeout
(
void
*
me_
)
{
return
0
;
}
int
raft_get_request_timeout
(
void
*
me_
)
{
return
0
;
}
int
raft_vote
(
void
*
me_
,
void
*
peer
)
{
return
0
;
...
...
@@ -235,3 +244,32 @@ int raft_append_command(void* me_, unsigned char* data, int len)
{
return
0
;
}
void
raft_set_commit_index
(
void
*
me_
,
int
commit_idx
)
{
}
void
raft_set_lastapplied_index
(
void
*
me_
,
int
idx
)
{
}
int
raft_get_lastapplied_index
(
void
*
me_
)
{
return
0
;
}
int
raft_get_commit_index
(
void
*
me_
)
{
return
0
;
}
void
raft_commit_command
(
void
*
me_
,
int
logIndex
)
{
}
void
raft_send_appendentries
(
void
*
me_
,
void
*
peer
)
{
}
test_candidate.c
View file @
47472f6e
...
...
@@ -174,7 +174,7 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
}
/* Candidate 5.2 */
void
TestRaft_candidate_requestvote_includes_log
info
(
CuTest
*
tc
)
void
TestRaft_candidate_requestvote_includes_log
Index
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
...
...
@@ -271,6 +271,6 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
/* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
0
==
raft_is_
follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_
candidate
(
r
));
}
test_follower.c
View file @
47472f6e
...
...
@@ -10,7 +10,7 @@
#include "mock_send_functions.h"
/* 5.1 */
void
TestRaft_follower_recv_appendentries_reply_false_
when
_term_less_than_currentterm
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_reply_false_
if
_term_less_than_currentterm
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
...
...
@@ -39,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_when_term_less_than_curren
CuAssertTrue
(
tc
,
0
==
aer
->
success
);
}
void
TestRaft_follower_recv_appendentries_updates_currentterm_
when
_term_gt_currentterm
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_updates_currentterm_
if
_term_gt_currentterm
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
msg_appendentries_t
ae
;
...
...
@@ -62,7 +62,7 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_when_term_gt_curre
}
/* 5.3 */
void
TestRaft_follower_recv_appendentries_reply_false_if_
log_does_not_contain_entry
_at_prevLogIndex
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_reply_false_if_
doesnt_have_log
_at_prevLogIndex
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
...
...
@@ -136,6 +136,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
};
msg_appendentries_t
ae
;
/* appendentries has multiple entries */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
...
...
@@ -148,6 +149,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
CuAssertTrue
(
tc
,
0
);
// msg = sender_poll_msg(sender);
// CuAssertTrue(tc, aer);
// CuAssertTrue(tc, 1 == sender_msg_is_appendentries(msg));
...
...
@@ -156,7 +158,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
//If leaderCommit > commitIndex, set commitIndex =
//min(leaderCommit, last log index)
void
TestRaft_follower_recv_appendentries_set_commitindex
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_set_commitindex
_to_prevLogIdx
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
...
...
@@ -166,21 +168,50 @@ void TestRaft_follower_recv_appendentries_set_commitindex(CuTest * tc)
};
msg_appendentries_t
ae
;
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* receive an appendentry with commit */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
ae
.
term
=
1
;
ae
.
prevLogTerm
=
1
;
ae
.
prevLogIndex
=
4
;
ae
.
leaderCommit
=
5
;
sender
=
sender_new
();
/* receipt of appendentries changes commit index */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
/* set to 4 because prevLogIdx is lower */
CuAssertTrue
(
tc
,
4
==
raft_get_commit_index
(
r
));
}
void
TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_appendentries_t
ae
;
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
// msg = sender_poll_msg(sender);
// CuAssertTrue(tc, aer);
// CuAssertTrue(tc, 1 == sender_msg_is_appendentries(msg));
// CuAssertTrue(tc, 1 == sender_msg_is_false(msg));
/* receive an appendentry with commit */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
1
;
ae
.
prevLogTerm
=
1
;
ae
.
prevLogIndex
=
4
;
ae
.
leaderCommit
=
3
;
/* receipt of appendentries changes commit index */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
/* set to 3 because leaderCommit is lower */
CuAssertTrue
(
tc
,
3
==
raft_get_commit_index
(
r
));
}
void
TestRaft_follower_increases_log_after_appendentry
(
CuTest
*
tc
)
...
...
@@ -233,10 +264,31 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
void
TestRaft_follower_resends_command_if_request_from_leader_times_out
(
CuTest
*
tc
)
#if 0
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
{
void *r, *peer;
msg_appendentries_t ae;
/* appendentry */
memset(&ae,0,sizeof(msg_appendentries_t));
r = raft_new();
/* three nodes */
peer = raft_add_peer(r,(void*)1);
raft_add_peer(r,(void*)2);
raft_set_state(r,RAFT_STATE_FOLLOWER);
/* log size s */
CuAssertTrue(tc, 0 == raft_get_log_count(r));
raft_recv_appendentries(r,peer,&ae);
CuAssertTrue(tc, 1 == raft_get_log_count(r));
}
#endif
void
TestRaft_follower_becomes_candidate_when_election_timeout_occurs
(
CuTest
*
tc
)
{
...
...
test_leader.c
View file @
47472f6e
...
...
@@ -14,46 +14,128 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
{
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_requestvote_response_t
vr
;
memset
(
&
vr
,
0
,
sizeof
(
msg_requestvote_response_t
));
vr
.
term
=
1
;
vr
.
voteGranted
=
1
;
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
/* candidate to leader */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_become_leader
(
r
);
/* receive appendentries messages for both peers */
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
/* 5.2 */
void
TestRaft_leader_responds_to_command_msg_when_command_is_committed
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
,
*
sender
;
msg_command_response_t
*
cr
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
sender
=
sender_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* I am the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
/* command message */
msg_command_t
cmd
;
cmd
.
id
=
1
;
cmd
.
data
=
"command"
;
cmd
.
len
=
strlen
(
"command"
);
/* receive command */
raft_recv_command
(
r
,
peer
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
/* trigger response through commit */
raft_commit_command
(
r
,
1
);
/* leader sent response to command message */
cr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
cr
);
}
/* 5.3 */
void
TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
/* 5.3 */
void
TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
/*
...
...
@@ -103,7 +185,43 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
void
TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry
(
CuTest
*
tc
)
{
void
*
p1
,
*
p2
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
msg_appendentries_response_t
aer
;
sender
=
sender_new
();
r
=
raft_new
();
/* 3 nodes */
p1
=
raft_add_peer
(
r
,(
void
*
)
1
);
p2
=
raft_add_peer
(
r
,(
void
*
)
2
);
/* I'm the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* the commit index will became 5 */
raft_set_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
5
);
raft_set_commit_index
(
r
,
4
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_send_appendentries
(
r
,
p1
);
raft_send_appendentries
(
r
,
p2
);
/* respond that we have the appendentries */
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
aer
.
term
=
5
;
aer
.
success
=
1
;
/* announce to leader that the majority have appended this log */
raft_recv_appendentries_response
(
r
,
p1
,
&
aer
);
raft_recv_appendentries_response
(
r
,
p2
,
&
aer
);
CuAssertTrue
(
tc
,
5
==
raft_get_commit_index
(
r
));
}
void
TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself
(
CuTest
*
tc
)
...
...
test_peer.c
0 → 100644
View file @
47472f6e
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "CuTest.h"
#include "raft.h"
void
TestRaft_peer_set_nextIdx
(
CuTest
*
tc
)
{
void
*
p
;
p
=
raft_peer_new
();
raft_peer_set_next_index
(
p
,
3
);
CuAssertTrue
(
tc
,
3
==
raft_peer_get_next_index
(
p
));
}
test_server.c
View file @
47472f6e
...
...
@@ -84,6 +84,14 @@ void TestRaft_server_starts_with_election_timeout_of_1000ms(CuTest * tc)
CuAssertTrue
(
tc
,
1000
==
raft_get_election_timeout
(
r
));
}
void
TestRaft_server_starts_with_request_timeout_of_500ms
(
CuTest
*
tc
)
{
void
*
r
;
r
=
raft_new
();
CuAssertTrue
(
tc
,
500
==
raft_get_election_timeout
(
r
));
}
void
TestRaft_server_increases_logindex_when_command_appended
(
CuTest
*
tc
)
{
void
*
r
;
...
...
@@ -93,3 +101,17 @@ void TestRaft_server_increases_logindex_when_command_appended(CuTest* tc)
raft_append_command
(
r
,
"aaa"
,
3
);
CuAssertTrue
(
tc
,
1
==
raft_get_current_index
(
r
));
}
// If commitIndex > lastApplied: increment lastApplied, apply
// log[lastApplied] to state machine (5.3)
void
TestRaft_server_increment_lastApplied_when_lastApplied_lt_commitIndex
(
CuTest
*
tc
)
{
void
*
r
;
r
=
raft_new
();
raft_set_commit_index
(
r
,
5
);
raft_set_lastapplied_index
(
r
,
4
);
raft_periodic
(
r
,
1
);
CuAssertTrue
(
tc
,
5
==
raft_get_lastapplied_index
(
r
));
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment