Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
Willemt Raft
Commits
0819b2e4
Commit
0819b2e4
authored
Sep 20, 2013
by
willem
Browse files
Switched to int from void* for peer references
parent
825ca97e
Changes
9
Show whitespace changes
Inline
Side-by-side
mock_send_functions.c
View file @
0819b2e4
...
@@ -20,7 +20,7 @@ typedef struct {
...
@@ -20,7 +20,7 @@ typedef struct {
void
*
inbox
;
void
*
inbox
;
}
sender_t
;
}
sender_t
;
int
sender_send
(
void
*
caller
,
void
*
udata
,
void
*
peer
,
const
unsigned
char
*
data
,
int
len
)
int
sender_send
(
void
*
caller
,
void
*
udata
,
int
peer
,
const
unsigned
char
*
data
,
int
len
)
{
{
sender_t
*
me
=
caller
;
sender_t
*
me
=
caller
;
unsigned
char
*
n
;
unsigned
char
*
n
;
...
...
mock_send_functions.h
View file @
0819b2e4
int
sender_send
(
void
*
caller
,
void
*
udata
,
void
*
peer
,
int
sender_send
(
void
*
caller
,
void
*
udata
,
int
peer
,
const
unsigned
char
*
data
,
const
int
len
);
const
unsigned
char
*
data
,
const
int
len
);
void
*
sender_new
();
void
*
sender_new
();
...
...
raft.h
View file @
0819b2e4
...
@@ -92,7 +92,7 @@ typedef int (
...
@@ -92,7 +92,7 @@ typedef int (
)
(
)
(
void
*
caller
,
void
*
caller
,
void
*
udata
,
void
*
udata
,
void
*
peer
,
int
peer
,
const
unsigned
char
*
send_data
,
const
unsigned
char
*
send_data
,
const
int
len
const
int
len
);
);
...
@@ -151,11 +151,11 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae);
...
@@ -151,11 +151,11 @@ int raft_receive_append_entries(raft_server_t* me, msg_appendentries_t* ae);
int
raft_periodic
(
raft_server_t
*
me
,
int
msec_since_last_period
);
int
raft_periodic
(
raft_server_t
*
me
,
int
msec_since_last_period
);
int
raft_recv_appendentries
(
raft_server_t
*
me
,
void
*
peer
,
msg_appendentries_t
*
ae
);
int
raft_recv_appendentries
(
raft_server_t
*
me
,
int
peer
,
msg_appendentries_t
*
ae
);
int
raft_recv_requestvote
(
raft_server_t
*
me
,
void
*
peer
,
msg_requestvote_t
*
vr
);
int
raft_recv_requestvote
(
raft_server_t
*
me
,
int
peer
,
msg_requestvote_t
*
vr
);
int
raft_recv_requestvote_response
(
raft_server_t
*
me
,
void
*
peer
,
msg_requestvote_response_t
*
r
);
int
raft_recv_requestvote_response
(
raft_server_t
*
me
,
int
peer
,
msg_requestvote_response_t
*
r
);
void
raft_execute_command
(
raft_server_t
*
me
);
void
raft_execute_command
(
raft_server_t
*
me
);
...
@@ -163,15 +163,15 @@ void raft_set_election_timeout(raft_server_t* me, int millisec);
...
@@ -163,15 +163,15 @@ void raft_set_election_timeout(raft_server_t* me, int millisec);
int
raft_get_election_timeout
(
raft_server_t
*
me
);
int
raft_get_election_timeout
(
raft_server_t
*
me
);
int
raft_vote
(
raft_server_t
*
me
,
void
*
peer
);
int
raft_vote
(
raft_server_t
*
me
,
int
peer
);
raft_peer_t
*
raft_add_peer
(
raft_server_t
*
me
,
void
*
peer_udata
);
raft_peer_t
*
raft_add_peer
(
raft_server_t
*
me
,
int
peer_udata
);
int
raft_remove_peer
(
raft_server_t
*
me
,
void
*
peer
);
int
raft_remove_peer
(
raft_server_t
*
me
,
int
peer
);
int
raft_get_num_peers
(
raft_server_t
*
me
);
int
raft_get_num_peers
(
raft_server_t
*
me
);
int
raft_recv_command
(
raft_server_t
*
me
,
void
*
peer
,
msg_command_t
*
cmd
);
int
raft_recv_command
(
raft_server_t
*
me
,
int
peer
,
msg_command_t
*
cmd
);
int
raft_get_log_count
(
raft_server_t
*
me
);
int
raft_get_log_count
(
raft_server_t
*
me
);
...
@@ -191,9 +191,9 @@ int raft_is_leader(raft_server_t* me);
...
@@ -191,9 +191,9 @@ int raft_is_leader(raft_server_t* me);
int
raft_is_candidate
(
raft_server_t
*
me
);
int
raft_is_candidate
(
raft_server_t
*
me
);
int
raft_send_requestvote
(
raft_server_t
*
me
,
void
*
peer
);
int
raft_send_requestvote
(
raft_server_t
*
me
,
int
peer
);
void
raft_send_appendentries
(
raft_server_t
*
me
,
void
*
peer
);
void
raft_send_appendentries
(
raft_server_t
*
me
,
int
peer
);
int
raft_append_command
(
raft_server_t
*
me
,
unsigned
char
*
data
,
int
len
);
int
raft_append_command
(
raft_server_t
*
me
,
unsigned
char
*
data
,
int
len
);
...
...
raft_server.c
View file @
0819b2e4
...
@@ -77,7 +77,10 @@ typedef struct {
...
@@ -77,7 +77,10 @@ typedef struct {
/* amount of time left till timeout */
/* amount of time left till timeout */
int
timeout_elapased
;
int
timeout_elapased
;
hashmap_t
*
peers
;
raft_peer_t
*
peers
;
int
npeers
;
// hashmap_t* peers;
// int log_Size;
// int log_Size;
}
raft_server_private_t
;
}
raft_server_private_t
;
...
@@ -106,7 +109,7 @@ raft_server_t* raft_new()
...
@@ -106,7 +109,7 @@ raft_server_t* raft_new()
me
=
calloc
(
1
,
sizeof
(
raft_server_private_t
));
me
=
calloc
(
1
,
sizeof
(
raft_server_private_t
));
me
->
current_index
=
0
;
me
->
current_index
=
0
;
me
->
timeout_elapased
=
0
;
me
->
timeout_elapased
=
0
;
me
->
peers
=
hashmap_new
(
__peer_hash
,
__peer_compare
,
100
);
//
me->peers = hashmap_new(__peer_hash, __peer_compare, 100);
return
(
void
*
)
me
;
return
(
void
*
)
me
;
}
}
...
@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_)
...
@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_)
void
raft_become_candidate
(
raft_server_t
*
me_
)
void
raft_become_candidate
(
raft_server_t
*
me_
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
raft_server_private_t
*
me
=
(
void
*
)
me_
;
hashmap_iterator_t
iter
;
//
hashmap_iterator_t iter;
void
*
p
;
void
*
p
;
int
ii
;
me
->
current_term
+=
1
;
me
->
current_term
+=
1
;
me
->
voted_for
=
me
;
me
->
voted_for
=
me
;
me
->
timeout_elapased
=
0
;
me
->
timeout_elapased
=
0
;
for
(
hashmap_iterator
(
me
->
peers
,
&
iter
);
// for (hashmap_iterator(me->peers, &iter);
(
p
=
hashmap_iterator_next_value
(
me
->
peers
,
&
iter
));)
// (p = hashmap_iterator_next_value(me->peers, &iter));)
for
(
ii
=
0
;
ii
<
me
->
npeers
;
ii
++
)
{
{
msg_requestvote_t
rv
;
msg_requestvote_t
rv
;
...
@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_)
...
@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_)
// rv.last_log_index = me->log
// rv.last_log_index = me->log
if
(
me
->
ext_func
&&
me
->
ext_func
->
send
)
if
(
me
->
ext_func
&&
me
->
ext_func
->
send
)
me
->
ext_func
->
send
(
me
->
caller
,
NULL
,
NULL
,
(
void
*
)
&
rv
,
sizeof
(
msg_requestvote_t
));
me
->
ext_func
->
send
(
me
->
caller
,
NULL
,
ii
,
(
void
*
)
&
rv
,
sizeof
(
msg_requestvote_t
));
}
}
}
}
...
@@ -203,22 +208,22 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
...
@@ -203,22 +208,22 @@ int raft_periodic(raft_server_t* me_, int msec_since_last_period)
/**
/**
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
* Invoked by leader to replicate log entries (§5.3); also used as heartbeat (§5.2). */
int
raft_recv_appendentries
(
raft_server_t
*
me_
,
void
*
peer
,
msg_appendentries_t
*
ae
)
int
raft_recv_appendentries
(
raft_server_t
*
me_
,
int
peer
,
msg_appendentries_t
*
ae
)
{
{
return
0
;
return
0
;
}
}
int
raft_recv_appendentries_response
(
raft_server_t
*
me_
,
void
*
peer
,
msg_appendentries_response_t
*
ae
)
int
raft_recv_appendentries_response
(
raft_server_t
*
me_
,
int
peer
,
msg_appendentries_response_t
*
ae
)
{
{
return
0
;
return
0
;
}
}
int
raft_recv_requestvote
(
raft_server_t
*
me_
,
void
*
peer
,
msg_requestvote_t
*
vr
)
int
raft_recv_requestvote
(
raft_server_t
*
me_
,
int
peer
,
msg_requestvote_t
*
vr
)
{
{
return
0
;
return
0
;
}
}
int
raft_recv_requestvote_response
(
raft_server_t
*
me_
,
void
*
peer
,
msg_requestvote_response_t
*
r
)
int
raft_recv_requestvote_response
(
raft_server_t
*
me_
,
int
peer
,
msg_requestvote_response_t
*
r
)
{
{
return
0
;
return
0
;
}
}
...
@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_)
...
@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_)
return
0
;
return
0
;
}
}
int
raft_vote
(
raft_server_t
*
me_
,
void
*
peer
)
int
raft_vote
(
raft_server_t
*
me_
,
int
peer
)
{
{
return
0
;
return
0
;
}
}
raft_peer_t
*
raft_add_peer
(
raft_server_t
*
me_
,
void
*
peer_udata
)
#if 0
raft_peer_t* raft_add_peer(raft_server_t* me_, int peer_udata)
{
{
raft_server_private_t* me = (void*)me_;
raft_server_private_t* me = (void*)me_;
raft_peer_t* p;
raft_peer_t* p;
...
@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
...
@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
return p;
return p;
}
}
int
raft_remove_peer
(
raft_server_t
*
me_
,
void
*
peer
)
int raft_remove_peer(raft_server_t* me_,
int
peer)
{
{
return 0;
return 0;
}
}
#endif
int
raft_get_num_peers
(
raft_server_t
*
me_
)
int
raft_get_num_peers
(
raft_server_t
*
me_
)
{
{
...
@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_)
...
@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_)
return
0
;
return
0
;
}
}
int
raft_recv_command
(
raft_server_t
*
me_
,
void
*
peer
,
msg_command_t
*
cmd
)
int
raft_recv_command
(
raft_server_t
*
me_
,
int
peer
,
msg_command_t
*
cmd
)
{
{
return
0
;
return
0
;
}
}
...
@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_)
...
@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_)
return
0
;
return
0
;
}
}
int
raft_send_requestvote
(
raft_server_t
*
me_
,
void
*
peer
)
int
raft_send_requestvote
(
raft_server_t
*
me_
,
int
peer
)
{
{
return
0
;
return
0
;
...
@@ -368,12 +375,22 @@ void raft_commit_command(raft_server_t* me_, int logIndex)
...
@@ -368,12 +375,22 @@ void raft_commit_command(raft_server_t* me_, int logIndex)
}
}
void
raft_send_appendentries
(
raft_server_t
*
me_
,
void
*
peer
)
void
raft_send_appendentries
(
raft_server_t
*
me_
,
int
peer
)
{
{
}
}
void
raft_set_configuration
(
raft_server_t
*
me_
,
raft_peer_configuration_t
*
peers
)
void
raft_set_configuration
(
raft_server_t
*
me_
,
raft_peer_configuration_t
*
peers
)
{
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
int
npeers
=
0
;
while
(
peers
->
udata_address
)
{
npeers
++
;
me
->
peers
=
realloc
(
me
->
peers
,
sizeof
(
raft_peer_t
*
)
*
npeers
);
me
->
npeers
=
npeers
;
me
->
peers
[
npeers
-
1
]
=
raft_peer_new
(
peers
);
peers
++
;
}
}
}
test_candidate.c
View file @
0819b2e4
...
@@ -89,15 +89,15 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe
...
@@ -89,15 +89,15 @@ void TestRaft_follower_becoming_candidate_requests_votes_from_other_servers(CuTe
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election
(
CuTest
*
tc
)
void
TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
raft_peer_configuration_t
cfg
[]
=
{
/* 2 peers */
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
{(
-
1
),
NULL
}};
...
@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
...
@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
/* three nodes */
raft_set_configuration
(
r
,
cfg
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_periodic
(
r
,
1
);
raft_periodic
(
r
,
1
);
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
0
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_leader
(
r
));
/* now has majority */
/* now has majority */
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_receives_majority_of_votes_becomes_leader
(
CuTest
*
tc
)
void
TestRaft_candidate_receives_majority_of_votes_becomes_leader
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_requestvote_response_t
vr
;
msg_requestvote_response_t
vr
;
memset
(
&
vr
,
0
,
sizeof
(
msg_requestvote_response_t
));
memset
(
&
vr
,
0
,
sizeof
(
msg_requestvote_response_t
));
...
@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
...
@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
/* three nodes */
raft_set_configuration
(
r
,
cfg
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
0
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_leader
(
r
));
/* now has majority */
/* now has majority */
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted
(
CuTest
*
tc
)
void
TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
...
@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
...
@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
...
@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
raft_set_election_timeout
(
r
,
1000
);
raft_set_election_timeout
(
r
,
1000
);
/* three nodes */
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
...
@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
...
@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
,
1
);
raft_periodic
(
r
,
1
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_requestvote_includes_logIndex
(
CuTest
*
tc
)
void
TestRaft_candidate_requestvote_includes_logIndex
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
...
@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
};
};
msg_requestvote_t
*
rv
;
msg_requestvote_t
*
rv
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
5
);
raft_set_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
3
);
raft_set_current_index
(
r
,
3
);
raft_send_requestvote
(
r
,
peer
);
raft_send_requestvote
(
r
,
1
);
rv
=
sender_poll_msg
(
sender
);
rv
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rv
);
CuAssertTrue
(
tc
,
NULL
!=
rv
);
...
@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
...
@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower
(
CuTest
*
tc
)
void
TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
...
@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
...
@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
...
@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
...
@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
,
1
);
raft_periodic
(
r
,
1
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
}
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower
(
CuTest
*
tc
)
void
TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* server's log is newer */
/* server's log is newer */
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_current_index
(
r
,
2
);
raft_set_current_index
(
r
,
2
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* is a candidate */
/* is a candidate */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
...
@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
...
@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
ae
.
prev_log_term
=
1
;
ae
.
prev_log_term
=
1
;
/* appendentry from invalid leader doesn't make candidate become follower */
/* appendentry from invalid leader doesn't make candidate become follower */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_candidate
(
r
));
}
}
test_follower.c
View file @
0819b2e4
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
/* 5.1 */
/* 5.1 */
void
TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
...
@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
*
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
/* term is low */
/* term is low */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
...
@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */
/* higher current term */
raft_set_current_term
(
r
,
5
);
raft_set_current_term
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
/* response is false */
/* response is false */
aer
=
sender_poll_msg
(
sender
);
aer
=
sender_poll_msg
(
sender
);
...
@@ -42,22 +49,29 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
...
@@ -42,22 +49,29 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
void
TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_currentterm
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
*
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* newer term */
/* newer term */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
ae
.
term
=
2
;
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
/* older currentterm */
/* older currentterm */
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
/* appendentry has newer term, so we change our currentterm */
/* appendentry has newer term, so we change our currentterm */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
}
}
...
@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
...
@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* 5.3 */
/* 5.3 */
void
TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev_log_index
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
msg_appendentries_response_t
*
aer
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* log index that server doesn't have */
/* log index that server doesn't have */
...
@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
...
@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
raft_set_current_term
(
r
,
5
);
raft_set_current_term
(
r
,
5
);
/* trigger reply */
/* trigger reply */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg
(
sender
);
aer
=
sender_poll_msg
(
sender
);
/* reply is false */
/* reply is false */
...
@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
...
@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
/* 5.3 */
/* 5.3 */
void
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
2
);
raft_set_current_term
(
r
,
2
);
...
@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
...
@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
ae
.
term
=
2
;
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
}
}
void
TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
...
@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
};
};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* appendentries has multiple entries */
/* appendentries has multiple entries */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
ae
.
term
=
2
;
...
@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
...
@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
0
);
CuAssertTrue
(
tc
,
0
);
// msg = sender_poll_msg(sender);
// msg = sender_poll_msg(sender);
...
@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
...
@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
//min(leaderCommit, last log index)
//min(leaderCommit, last log index)
void
TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
...
@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
};
};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* receive an appendentry with commit */
/* receive an appendentry with commit */
...
@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
...
@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
ae
.
leader_commit
=
5
;
ae
.
leader_commit
=
5
;
/* receipt of appendentries changes commit index */
/* receipt of appendentries changes commit index */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
/* set to 4 because prevLogIdx is lower */
/* set to 4 because prevLogIdx is lower */
CuAssertTrue
(
tc
,
4
==
raft_get_commit_index
(
r
));
CuAssertTrue
(
tc
,
4
==
raft_get_commit_index
(
r
));
}
}
void
TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit
(
CuTest
*
tc
)
void
TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
...
@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
};
};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* receive an appendentry with commit */
/* receive an appendentry with commit */
...
@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
...
@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
ae
.
leader_commit
=
3
;
ae
.
leader_commit
=
3
;
/* receipt of appendentries changes commit index */
/* receipt of appendentries changes commit index */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
/* set to 3 because leaderCommit is lower */
/* set to 3 because leaderCommit is lower */
CuAssertTrue
(
tc
,
3
==
raft_get_commit_index
(
r
));
CuAssertTrue
(
tc
,
3
==
raft_get_commit_index
(
r
));
}
}
void
TestRaft_follower_increases_log_after_appendentry
(
CuTest
*
tc
)
void
TestRaft_follower_increases_log_after_appendentry
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* appendentry */
/* appendentry */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
r
=
raft_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
/* log size s */
/* log size s */
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
}
void
TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones
(
CuTest
*
tc
)
void
TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
r
=
raft_new
();
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* three nodes */
pee
r
=
raft_
add_peer
(
r
,(
void
*
)
1
);
r
=
raft_
new
(
);
raft_
add_peer
(
r
,(
void
*
)
2
);
raft_
set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
...
@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
...
@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
}
#if 0
#if 0
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
{
{
void *r
, *peer
;
void *r;
msg_appendentries_t ae;
msg_appendentries_t ae;
...
@@ -292,16 +346,21 @@ void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest *
...
@@ -292,16 +346,21 @@ void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest *
void
TestRaft_follower_becomes_candidate_when_election_timeout_occurs
(
CuTest
*
tc
)
void
TestRaft_follower_becomes_candidate_when_election_timeout_occurs
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
r
=
raft_new
();
r
=
raft_new
();
/* 1 second election timeout */
/* 1 second election timeout */
raft_set_election_timeout
(
r
,
1000
);
raft_set_election_timeout
(
r
,
1000
);
/* three nodes */
raft_set_configuration
(
r
,
cfg
);
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* 1.001 seconds have passed */
/* 1.001 seconds have passed */
raft_periodic
(
r
,
1001
);
raft_periodic
(
r
,
1001
);
...
@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t
...
@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t
/* Candidate 5.2 */
/* Candidate 5.2 */
void
TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log
(
CuTest
*
tc
)
void
TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_requestvote_t
rv
;
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
*
rvr
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* request vote */
/* request vote */
/* vote indicates candidate's log is not complete compared to follower */
/* vote indicates candidate's log is not complete compared to follower */
...
@@ -344,7 +407,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe
...
@@ -344,7 +407,7 @@ void TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log(CuTe
raft_set_current_index
(
r
,
2
);
raft_set_current_index
(
r
,
2
);
/* vote not granted */
/* vote not granted */
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
...
...
test_leader.c
View file @
0819b2e4
...
@@ -19,15 +19,18 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
...
@@ -19,15 +19,18 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
*
ae
;
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* candidate to leader */
/* candidate to leader */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
...
@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
...
@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
/* 5.2 */
/* 5.2 */
void
TestRaft_leader_responds_to_command_msg_when_command_is_committed
(
CuTest
*
tc
)
void
TestRaft_leader_responds_to_command_msg_when_command_is_committed
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
,
*
sender
;
void
*
r
,
*
sender
;
msg_command_response_t
*
cr
;
msg_command_response_t
*
cr
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* I am the leader */
/* I am the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
...
@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
...
@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
cmd
.
len
=
strlen
(
"command"
);
cmd
.
len
=
strlen
(
"command"
);
/* receive command */
/* receive command */
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
/* trigger response through commit */
/* trigger response through commit */
...
@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
...
@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
/* 5.3 */
/* 5.3 */
void
TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx
(
CuTest
*
tc
)
void
TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
*
ae
;
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* i'm leader */
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg
(
sender
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
}
...
@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
...
@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
/* 5.3 */
/* 5.3 */
void
TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency
(
CuTest
*
tc
)
void
TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
*
ae
;
msg_appendentries_t
*
ae
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* i'm leader */
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg
(
sender
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
}
...
@@ -146,7 +161,14 @@ set commitIndex = N (
...
@@ -146,7 +161,14 @@ set commitIndex = N (
void
TestRaft_leader_append_command_to_log_increases_idxno
(
CuTest
*
tc
)
void
TestRaft_leader_append_command_to_log_increases_idxno
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_command_t
cmd
;
msg_command_t
cmd
;
cmd
.
id
=
1
;
cmd
.
id
=
1
;
...
@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
...
@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
cmd
.
len
=
strlen
(
"command"
);
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
}
void
TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate
(
CuTest
*
tc
)
void
TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate
(
CuTest
*
tc
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_command_t
cmd
;
msg_command_t
cmd
;
cmd
.
id
=
1
;
cmd
.
id
=
1
;
...
@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
...
@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
cmd
.
len
=
strlen
(
"command"
);
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
}
}
void
TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry
(
CuTest
*
tc
)
void
TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_newer_entry
(
CuTest
*
tc
)
{
{
void
*
p1
,
*
p2
;
void
*
r
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
...
@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
...
@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
};
};
msg_appendentries_response_t
aer
;
msg_appendentries_response_t
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
/* 3 nodes */
p1
=
raft_add_peer
(
r
,(
void
*
)
1
);
p2
=
raft_add_peer
(
r
,(
void
*
)
2
);
/* I'm the leader */
/* I'm the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
...
@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
...
@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
raft_set_commit_index
(
r
,
4
);
raft_set_commit_index
(
r
,
4
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_send_appendentries
(
r
,
p
1
);
raft_send_appendentries
(
r
,
1
);
raft_send_appendentries
(
r
,
p
2
);
raft_send_appendentries
(
r
,
2
);
/* respond that we have the appendentries */
/* respond that we have the appendentries */
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
...
@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
aer
.
success
=
1
;
aer
.
success
=
1
;
/* announce to leader that the majority have appended this log */
/* announce to leader that the majority have appended this log */
raft_recv_appendentries_response
(
r
,
p
1
,
&
aer
);
raft_recv_appendentries_response
(
r
,
1
,
&
aer
);
raft_recv_appendentries_response
(
r
,
p
2
,
&
aer
);
raft_recv_appendentries_response
(
r
,
2
,
&
aer
);
CuAssertTrue
(
tc
,
5
==
raft_get_commit_index
(
r
));
CuAssertTrue
(
tc
,
5
==
raft_get_commit_index
(
r
));
}
}
void
TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself
(
CuTest
*
tc
)
void
TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself
(
CuTest
*
tc
)
{
{
void
*
peer
;
void
*
r
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
.
log
=
NULL
.
log
=
NULL
};
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
...
@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
raft_set_current_term
(
r
,
5
);
raft_set_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
5
);
raft_set_current_index
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
}
...
...
test_server.c
View file @
0819b2e4
...
@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc)
...
@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc)
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
CuAssertTrue
(
tc
,
2
==
raft_get_current_term
(
r
));
}
}
void
TestRaft_add_peer
(
CuTest
*
tc
)
#if 0
void T_estRaft_add_peer(CuTest * tc)
{
{
void *r;
void *r;
...
@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc)
...
@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
}
}
void
TestRaft_dont_add_duplicate_peers
(
CuTest
*
tc
)
void T
_
estRaft_dont_add_duplicate_peers(CuTest * tc)
{
{
void *r;
void *r;
...
@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc)
...
@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
}
}
void
TestRaft_remove_peer
(
CuTest
*
tc
)
void T
_
estRaft_remove_peer(CuTest * tc)
{
{
void *r;
void *r;
void *peer;
void *peer;
...
@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc)
...
@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc)
raft_remove_peer(r,peer);
raft_remove_peer(r,peer);
CuAssertTrue(tc, 0 == raft_get_num_peers(r));
CuAssertTrue(tc, 0 == raft_get_num_peers(r));
}
}
#endif
void
TestRaft_set_state
(
CuTest
*
tc
)
void
TestRaft_set_state
(
CuTest
*
tc
)
{
{
...
...
test_server_request_vote.c
View file @
0819b2e4
...
@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
...
@@ -18,7 +18,7 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
CuTest
*
tc
CuTest
*
tc
)
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
send
=
sender_send
,
...
@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
...
@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
msg_requestvote_t
rv
;
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
*
rvr
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_t
));
rv
.
term
=
2
;
rv
.
term
=
2
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
...
@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
...
@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest
*
tc
CuTest
*
tc
)
)
{
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
sender
;
void
*
msg
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
raft_external_functions_t
funcs
=
{
...
@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
...
@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
msg_requestvote_t
rv
;
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
msg_requestvote_response_t
*
rvr
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_response_t
));
memset
(
&
rv
,
0
,
sizeof
(
msg_requestvote_response_t
));
rv
.
term
=
1
;
rv
.
term
=
1
;
sender
=
sender_new
();
sender
=
sender_new
();
r
=
raft_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_current_term
(
r
,
1
);
raft_vote
(
r
,
peer
);
raft_vote
(
r
,
1
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
...
...
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