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 {
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
};
raft_peer_configuration_t
cfg
[]
=
{
/* 2 peers */
raft_peer_configuration_t
cfg
[]
=
{
{(
-
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