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
0819b2e4
Commit
0819b2e4
authored
Sep 20, 2013
by
willem
Browse files
Switched to int from void* for peer references
parent
825ca97e
Changes
9
Hide whitespace changes
Inline
Side-by-side
mock_send_functions.c
View file @
0819b2e4
...
...
@@ -20,7 +20,7 @@ typedef struct {
void
*
inbox
;
}
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
;
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
);
void
*
sender_new
();
...
...
raft.h
View file @
0819b2e4
...
...
@@ -92,7 +92,7 @@ typedef int (
)
(
void
*
caller
,
void
*
udata
,
void
*
peer
,
int
peer
,
const
unsigned
char
*
send_data
,
const
int
len
);
...
...
@@ -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_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
);
...
...
@@ -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_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_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
);
...
...
@@ -191,9 +191,9 @@ int raft_is_leader(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
);
...
...
raft_server.c
View file @
0819b2e4
...
...
@@ -77,7 +77,10 @@ typedef struct {
/* amount of time left till timeout */
int
timeout_elapased
;
hashmap_t
*
peers
;
raft_peer_t
*
peers
;
int
npeers
;
// hashmap_t* peers;
// int log_Size;
}
raft_server_private_t
;
...
...
@@ -106,7 +109,7 @@ raft_server_t* raft_new()
me
=
calloc
(
1
,
sizeof
(
raft_server_private_t
));
me
->
current_index
=
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
;
}
...
...
@@ -149,15 +152,17 @@ void raft_become_leader(raft_server_t* me_)
void
raft_become_candidate
(
raft_server_t
*
me_
)
{
raft_server_private_t
*
me
=
(
void
*
)
me_
;
hashmap_iterator_t
iter
;
//
hashmap_iterator_t iter;
void
*
p
;
int
ii
;
me
->
current_term
+=
1
;
me
->
voted_for
=
me
;
me
->
timeout_elapased
=
0
;
for
(
hashmap_iterator
(
me
->
peers
,
&
iter
);
(
p
=
hashmap_iterator_next_value
(
me
->
peers
,
&
iter
));)
// for (hashmap_iterator(me->peers, &iter);
// (p = hashmap_iterator_next_value(me->peers, &iter));)
for
(
ii
=
0
;
ii
<
me
->
npeers
;
ii
++
)
{
msg_requestvote_t
rv
;
...
...
@@ -166,7 +171,7 @@ void raft_become_candidate(raft_server_t* me_)
// rv.last_log_index = me->log
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)
/**
* 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
;
}
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
;
}
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
;
}
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
;
}
...
...
@@ -245,12 +250,13 @@ int raft_get_request_timeout(raft_server_t* me_)
return
0
;
}
int
raft_vote
(
raft_server_t
*
me_
,
void
*
peer
)
int
raft_vote
(
raft_server_t
*
me_
,
int
peer
)
{
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_peer_t* p;
...
...
@@ -265,10 +271,11 @@ raft_peer_t* raft_add_peer(raft_server_t* me_, void* peer_udata)
return p;
}
int
raft_remove_peer
(
raft_server_t
*
me_
,
void
*
peer
)
int raft_remove_peer(raft_server_t* me_,
int
peer)
{
return 0;
}
#endif
int
raft_get_num_peers
(
raft_server_t
*
me_
)
{
...
...
@@ -276,7 +283,7 @@ int raft_get_num_peers(raft_server_t* me_)
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
;
}
...
...
@@ -334,7 +341,7 @@ int raft_is_candidate(raft_server_t* me_)
return
0
;
}
int
raft_send_requestvote
(
raft_server_t
*
me_
,
void
*
peer
)
int
raft_send_requestvote
(
raft_server_t
*
me_
,
int
peer
)
{
return
0
;
...
...
@@ -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
)
{
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
/* Candidate 5.2 */
void
TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
/* 2 peers */
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
...
...
@@ -111,32 +111,35 @@ void TestRaft_candidate_election_timeout_and_no_leader_results_in_new_election(C
sender
=
sender_new
();
r
=
raft_new
();
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
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
));
/* now has majority */
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
}
/* Candidate 5.2 */
void
TestRaft_candidate_receives_majority_of_votes_becomes_leader
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_requestvote_response_t
vr
;
memset
(
&
vr
,
0
,
sizeof
(
msg_requestvote_response_t
));
...
...
@@ -146,24 +149,22 @@ void TestRaft_candidate_receives_majority_of_votes_becomes_leader(CuTest * tc)
sender
=
sender_new
();
r
=
raft_new
();
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
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
));
/* now has majority */
raft_recv_requestvote_response
(
r
,
peer
,
&
vr
);
raft_recv_requestvote_response
(
r
,
1
,
&
vr
);
CuAssertTrue
(
tc
,
1
==
raft_is_leader
(
r
));
}
/* Candidate 5.2 */
void
TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -171,6 +172,13 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -180,11 +188,10 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
sender
=
sender_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
raft_set_election_timeout
(
r
,
1000
);
/* three nodes */
peer
=
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
);
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
...
...
@@ -192,14 +199,14 @@ void TestRaft_candidate_will_not_respond_to_voterequest_if_it_has_already_voted(
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
,
1
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
/* Candidate 5.2 */
void
TestRaft_candidate_requestvote_includes_logIndex
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -207,18 +214,22 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
};
msg_requestvote_t
*
rv
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
raft_set_configuration
(
r
,
cfg
);
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_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
3
);
raft_send_requestvote
(
r
,
peer
);
raft_send_requestvote
(
r
,
1
);
rv
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rv
);
...
...
@@ -229,7 +240,7 @@ void TestRaft_candidate_requestvote_includes_logIndex(CuTest * tc)
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -237,16 +248,20 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
sender
=
sender_new
();
r
=
raft_new
();
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_current_term
(
r
,
1
);
...
...
@@ -254,34 +269,38 @@ void TestRaft_candidate_recv_appendentries_frm_leader_results_in_follower(CuTest
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
raft_periodic
(
r
,
1
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
1
==
raft_is_follower
(
r
));
}
/* Candidate 5.2 */
void
TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_follower
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
sender
=
sender_new
();
r
=
raft_new
();
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_set_configuration
(
r
,
cfg
);
/* server's log is newer */
raft_set_current_term
(
r
,
1
);
raft_set_current_index
(
r
,
2
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
/* is a candidate */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
CuAssertTrue
(
tc
,
0
==
raft_is_follower
(
r
));
...
...
@@ -293,7 +312,7 @@ void TestRaft_candidate_recv_appendentries_frm_invalid_leader_doesnt_result_in_f
ae
.
prev_log_term
=
1
;
/* 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
));
}
test_follower.c
View file @
0819b2e4
...
...
@@ -12,7 +12,7 @@
/* 5.1 */
void
TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentterm
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -21,9 +21,16 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
/* term is low */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -32,7 +39,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_term_less_than_currentt
/* higher current term */
raft_set_current_term
(
r
,
5
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
/* response is false */
aer
=
sender_poll_msg
(
sender
);
...
...
@@ -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
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* newer term */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
/* older currentterm */
raft_set_current_term
(
r
,
1
);
/* 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
));
}
...
...
@@ -65,19 +79,25 @@ void TestRaft_follower_recv_appendentries_updates_currentterm_if_term_gt_current
/* 5.3 */
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
*
msg
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
msg_appendentries_response_t
*
aer
;
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* log index that server doesn't have */
...
...
@@ -89,7 +109,7 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
raft_set_current_term
(
r
,
5
);
/* trigger reply */
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
aer
=
sender_poll_msg
(
sender
);
/* reply is false */
...
...
@@ -100,11 +120,17 @@ void TestRaft_follower_recv_appendentries_reply_false_if_doesnt_have_log_at_prev
/* 5.3 */
void
TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_entries
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
2
);
...
...
@@ -122,13 +148,13 @@ void TestRaft_follower_recv_appendentries_delete_entries_if_conflict_with_new_en
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
0
==
raft_get_log_count
(
r
));
}
void
TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -136,6 +162,13 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
};
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* appendentries has multiple entries */
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
ae
.
term
=
2
;
...
...
@@ -143,11 +176,11 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_appendentries
(
r
,
peer
,
&
ae
);
raft_recv_appendentries
(
r
,
1
,
&
ae
);
CuAssertTrue
(
tc
,
0
);
// msg = sender_poll_msg(sender);
...
...
@@ -160,7 +193,7 @@ void TestRaft_follower_recv_appendentries_add_new_entries_not_already_in_log(CuT
//min(leaderCommit, last log index)
void
TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -168,9 +201,15 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
};
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* receive an appendentry with commit */
...
...
@@ -181,14 +220,14 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_prevLogIdx(CuTest *
ae
.
leader_commit
=
5
;
/* 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 */
CuAssertTrue
(
tc
,
4
==
raft_get_commit_index
(
r
));
}
void
TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -196,9 +235,16 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
};
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
/* receive an appendentry with commit */
...
...
@@ -209,46 +255,54 @@ void TestRaft_follower_recv_appendentries_set_commitindex_to_LeaderCommit(CuTest
ae
.
leader_commit
=
3
;
/* 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 */
CuAssertTrue
(
tc
,
3
==
raft_get_commit_index
(
r
));
}
void
TestRaft_follower_increases_log_after_appendentry
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
msg_appendentries_t
ae
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
/* 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_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_FOLLOWER
);
/* log size s */
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
));
}
void
TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_preceding_ones
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
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
);
raft_
add_peer
(
r
,(
void
*
)
2
);
r
=
raft_
new
(
);
raft_
set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
...
...
@@ -260,14 +314,14 @@ void TestRaft_follower_rejects_appendentries_if_idx_and_term_dont_match_precedin
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
));
}
#if 0
void T_estRaft_follower_resends_command_if_request_from_leader_timesout(CuTest * tc)
{
void *r
, *peer
;
void *r;
msg_appendentries_t ae;
...
...
@@ -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
*
r
,
*
peer
;
void
*
r
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
r
=
raft_new
();
/* 1 second election timeout */
raft_set_election_timeout
(
r
,
1000
);
/* three nodes */
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_configuration
(
r
,
cfg
);
/* 1.001 seconds have passed */
raft_periodic
(
r
,
1001
);
...
...
@@ -313,23 +372,27 @@ void TestRaft_follower_becomes_candidate_when_election_timeout_occurs(CuTest * t
/* Candidate 5.2 */
void
TestRaft_follower_dont_grant_vote_if_candidate_has_a_less_complete_log
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_requestvote_t
rv
;
msg_requestvote_response_t
*
rvr
;
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
);
raft_set_configuration
(
r
,
cfg
);
/* request vote */
/* 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
raft_set_current_index
(
r
,
2
);
/* vote not granted */
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
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 *
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
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_configuration
(
r
,
cfg
);
/* candidate to leader */
raft_set_state
(
r
,
RAFT_STATE_CANDIDATE
);
...
...
@@ -43,20 +46,24 @@ void TestRaft_leader_when_it_becomes_a_leader_sends_empty_appendentries(CuTest *
/* 5.2 */
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
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
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
);
raft_set_configuration
(
r
,
cfg
);
/* I am the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
...
...
@@ -69,7 +76,7 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
cmd
.
len
=
strlen
(
"command"
);
/* receive command */
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
CuAssertTrue
(
tc
,
1
==
raft_get_log_count
(
r
));
/* trigger response through commit */
...
...
@@ -83,28 +90,32 @@ void TestRaft_leader_responds_to_command_msg_when_command_is_committed(CuTest *
/* 5.3 */
void
TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
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
);
raft_set_configuration
(
r
,
cfg
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
...
...
@@ -112,28 +123,32 @@ void TestRaft_leader_sends_appendentries_with_NextIdx_when_PrevIdx_gt_NextIdx(Cu
/* 5.3 */
void
TestRaft_leader_retries_appendentries_with_decremented_NextIdx_log_inconsistency
(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
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
);
raft_set_configuration
(
r
,
cfg
);
/* i'm leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
/* receive appendentries messages */
raft_send_appendentries
(
r
,
peer
);
raft_send_appendentries
(
r
,
1
);
ae
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
ae
);
}
...
...
@@ -146,7 +161,14 @@ set commitIndex = N (
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
;
cmd
.
id
=
1
;
...
...
@@ -154,17 +176,23 @@ void TestRaft_leader_append_command_to_log_increases_idxno(CuTest * tc)
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
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
));
}
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
;
cmd
.
id
=
1
;
...
...
@@ -172,20 +200,20 @@ void TestRaft_leader_doesnt_append_command_if_unique_id_is_duplicate(CuTest * tc
cmd
.
len
=
strlen
(
"command"
);
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
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
));
raft_recv_command
(
r
,
peer
,
&
cmd
);
raft_recv_command
(
r
,
1
,
&
cmd
);
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
*
p1
,
*
p2
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
...
...
@@ -194,12 +222,15 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
};
msg_appendentries_response_t
aer
;
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
sender
=
sender_new
();
r
=
raft_new
();
/* 3 nodes */
p1
=
raft_add_peer
(
r
,(
void
*
)
1
);
p2
=
raft_add_peer
(
r
,(
void
*
)
2
);
raft_set_configuration
(
r
,
cfg
);
/* I'm the leader */
raft_set_state
(
r
,
RAFT_STATE_LEADER
);
...
...
@@ -210,8 +241,8 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
raft_set_commit_index
(
r
,
4
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_send_appendentries
(
r
,
p
1
);
raft_send_appendentries
(
r
,
p
2
);
raft_send_appendentries
(
r
,
1
);
raft_send_appendentries
(
r
,
2
);
/* respond that we have the appendentries */
memset
(
&
aer
,
0
,
sizeof
(
msg_appendentries_response_t
));
...
...
@@ -219,20 +250,26 @@ void TestRaft_leader_increase_commitno_when_majority_have_entry_and_atleast_one_
aer
.
success
=
1
;
/* announce to leader that the majority have appended this log */
raft_recv_appendentries_response
(
r
,
p
1
,
&
aer
);
raft_recv_appendentries_response
(
r
,
p
2
,
&
aer
);
raft_recv_appendentries_response
(
r
,
1
,
&
aer
);
raft_recv_appendentries_response
(
r
,
2
,
&
aer
);
CuAssertTrue
(
tc
,
5
==
raft_get_commit_index
(
r
));
}
void
TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself
(
CuTest
*
tc
)
{
void
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
.
log
=
NULL
};
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
1
),(
void
*
)
1
},
{(
-
1
),(
void
*
)
2
},
{(
-
1
),
NULL
}};
msg_appendentries_t
ae
;
memset
(
&
ae
,
0
,
sizeof
(
msg_appendentries_t
));
...
...
@@ -242,12 +279,13 @@ void TestRaft_leader_steps_down_if_received_appendentries_is_newer_than_itself(C
sender
=
sender_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_current_term
(
r
,
5
);
raft_set_current_index
(
r
,
5
);
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
));
}
...
...
test_server.c
View file @
0819b2e4
...
...
@@ -37,7 +37,8 @@ void TestRaft_election_start_increments_term(CuTest * tc)
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;
...
...
@@ -47,7 +48,7 @@ void TestRaft_add_peer(CuTest * tc)
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;
...
...
@@ -58,7 +59,7 @@ void TestRaft_dont_add_duplicate_peers(CuTest * tc)
CuAssertTrue(tc, 1 == raft_get_num_peers(r));
}
void
TestRaft_remove_peer
(
CuTest
*
tc
)
void T
_
estRaft_remove_peer(CuTest * tc)
{
void *r;
void *peer;
...
...
@@ -69,6 +70,7 @@ void TestRaft_remove_peer(CuTest * tc)
raft_remove_peer(r,peer);
CuAssertTrue(tc, 0 == raft_get_num_peers(r));
}
#endif
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
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
raft_external_functions_t
funcs
=
{
.
send
=
sender_send
,
...
...
@@ -27,17 +27,24 @@ void TestRaft_server_recv_requestvote_reply_false_if_term_less_than_current_term
msg_requestvote_t
rv
;
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
));
rv
.
term
=
2
;
sender
=
sender_new
();
r
=
raft_new
();
peer
=
raft_add_peer
(
r
,(
void
*
)
1
);
raft_set_configuration
(
r
,
cfg
);
raft_set_current_term
(
r
,
1
);
raft_set_external_functions
(
r
,
&
funcs
,
sender
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
CuAssertTrue
(
tc
,
0
==
rvr
->
vote_granted
);
...
...
@@ -49,7 +56,7 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
CuTest
*
tc
)
{
void
*
r
,
*
peer
;
void
*
r
;
void
*
sender
;
void
*
msg
;
raft_external_functions_t
funcs
=
{
...
...
@@ -59,18 +66,24 @@ void TestRaft_server_dont_grant_vote_if_we_didnt_vote_for_this_candidate(
msg_requestvote_t
rv
;
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
));
rv
.
term
=
1
;
sender
=
sender_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_current_term
(
r
,
1
);
raft_vote
(
r
,
peer
);
raft_recv_requestvote
(
r
,
peer
,
&
rv
);
raft_vote
(
r
,
1
);
raft_recv_requestvote
(
r
,
1
,
&
rv
);
rvr
=
sender_poll_msg
(
sender
);
CuAssertTrue
(
tc
,
NULL
!=
rvr
);
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