Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
resetius committed Nov 25, 2023
1 parent 3650388 commit cefead1
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ static_assert(sizeof(TRequestVoteRequest) == sizeof(TMessageEx)+24);
struct TRequestVoteResponse: public TMessageEx {
static constexpr EMessageType MessageType = EMessageType::REQUEST_VOTE_RESPONSE;
uint32_t VoteGranted;
uint32_t Padding = 0;
};

static_assert(sizeof(TRequestVoteResponse) == sizeof(TMessageEx)+8);

struct TAppendEntriesRequest: public TMessageEx {
static constexpr EMessageType MessageType = EMessageType::APPEND_ENTRIES_REQUEST;
uint64_t PrevLogIndex;
Expand Down
3 changes: 2 additions & 1 deletion src/raft.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,10 @@ class TRaft {
return Id;
}

std::unique_ptr<TResult> Candidate(ITimeSource::Time now, TMessageHolder<TMessage> message);

private:
std::unique_ptr<TResult> Follower(ITimeSource::Time now, TMessageHolder<TMessage> message);
std::unique_ptr<TResult> Candidate(ITimeSource::Time now, TMessageHolder<TMessage> message);
std::unique_ptr<TResult> Leader(ITimeSource::Time now, TMessageHolder<TMessage> message);

std::unique_ptr<TResult> OnRequestVote(TMessageHolder<TRequestVoteRequest> message);
Expand Down
46 changes: 46 additions & 0 deletions test/test_raft.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,50 @@ void test_candidate_initiate_election(void**) {
assert_message_equal(messages[1], r);
}

void test_candidate_vote_request_small_term(void**) {
auto ts = std::make_shared<TFakeTimeSource>();
auto raft = MakeRaft({}, 3, ts);
auto req = NewHoldedMessage<TRequestVoteRequest>();
req->Src = 2;
req->Dst = 1;
req->Term = 0;
req->CandidateId = 2;
req->LastLogTerm = 1;
req->LastLogIndex = 1;
auto result = raft->Candidate(ts->Now(), std::move(req));
TRequestVoteResponse r;
r.Type = static_cast<uint32_t>(EMessageType::REQUEST_VOTE_RESPONSE);
r.Len = sizeof(r);
r.Src = 1;
r.Dst = 2;
r.Term = raft->GetState()->CurrentTerm;
r.VoteGranted = false;
assert_message_equal(result->Message, r);
assert_int_equal(raft->GetState()->CurrentTerm, 1);
}

void test_candidate_vote_request_ok_term(void**) {
auto ts = std::make_shared<TFakeTimeSource>();
auto raft = MakeRaft({}, 3, ts);
auto req = NewHoldedMessage<TRequestVoteRequest>();
req->Src = 2;
req->Dst = 1;
req->Term = 1;
req->CandidateId = 2;
req->LastLogTerm = 1;
req->LastLogIndex = 1;
auto result = raft->Candidate(ts->Now(), std::move(req));
TRequestVoteResponse r;
r.Type = static_cast<uint32_t>(EMessageType::REQUEST_VOTE_RESPONSE);
r.Len = sizeof(r);
r.Src = 1;
r.Dst = 2;
r.Term = raft->GetState()->CurrentTerm;
r.VoteGranted = true;
assert_message_equal(result->Message, r);
assert_int_equal(raft->GetState()->CurrentTerm, 1);
}

int main() {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_empty),
Expand All @@ -462,6 +506,8 @@ int main() {
cmocka_unit_test(test_follower_append_entries_7f),
cmocka_unit_test(test_follower_append_entries_empty_to_empty_log),
cmocka_unit_test(test_candidate_initiate_election),
cmocka_unit_test(test_candidate_vote_request_small_term),
cmocka_unit_test(test_candidate_vote_request_ok_term),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}

0 comments on commit cefead1

Please sign in to comment.