summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/vote_requester_test.cpp
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-06-11 09:47:34 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-06-16 11:56:16 -0400
commit64573bc33c058231bed22bd5fd44c609431b5a62 (patch)
tree6daab898e0eb28cb37ac68621f7f24baeb8297af /src/mongo/db/repl/vote_requester_test.cpp
parent22dd61cfe60e05b13f9bb92aee3cb4660392435b (diff)
downloadmongo-64573bc33c058231bed22bd5fd44c609431b5a62.tar.gz
SERVER-18385 add DryRun support to RequestVotes, VoteRequester, and TopologyCoordinator
Diffstat (limited to 'src/mongo/db/repl/vote_requester_test.cpp')
-rw-r--r--src/mongo/db/repl/vote_requester_test.cpp119
1 files changed, 118 insertions, 1 deletions
diff --git a/src/mongo/db/repl/vote_requester_test.cpp b/src/mongo/db/repl/vote_requester_test.cpp
index 90d0843d843..d5b9d9ce3d5 100644
--- a/src/mongo/db/repl/vote_requester_test.cpp
+++ b/src/mongo/db/repl/vote_requester_test.cpp
@@ -75,6 +75,7 @@ namespace {
_requester.reset(new VoteRequester::Algorithm(config,
candidateId,
term,
+ false, // not a dryRun
lastOplogEntry));
}
@@ -173,10 +174,36 @@ namespace {
Milliseconds(10)));
}
- private:
std::unique_ptr<VoteRequester::Algorithm> _requester;
};
+ class VoteRequesterDryRunTest : public VoteRequesterTest {
+ public:
+ virtual void setUp() {
+ ReplicaSetConfig config;
+ ASSERT_OK(config.initialize(
+ BSON("_id" << "rs0" <<
+ "version" << 2 <<
+ "members" << BSON_ARRAY(
+ BSON("_id" << 0 << "host" << "host0") <<
+ BSON("_id" << 1 << "host" << "host1") <<
+ BSON("_id" << 2 << "host" << "host2") <<
+ BSON("_id" << 3 << "host" << "host3" << "votes" << 0) <<
+ BSON("_id" << 4 << "host" << "host4" << "votes" << 0)))));
+ ASSERT_OK(config.validate());
+ long long candidateId = 0;
+ long long term = 2;
+ OpTime lastOplogEntry = OpTime(Timestamp(999,0), 1);
+
+ _requester.reset(new VoteRequester::Algorithm(config,
+ candidateId,
+ term,
+ true, // dryRun
+ lastOplogEntry));
+ }
+
+ };
+
TEST_F(VoteRequesterTest, ImmediateGoodResponseWinElection) {
ASSERT_FALSE(hasReceivedSufficientResponses());
processResponse(requestFrom("host1"), votedYes());
@@ -267,6 +294,96 @@ namespace {
stopCapturingLogMessages();
}
+ TEST_F(VoteRequesterDryRunTest, ImmediateGoodResponseWinElection) {
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ }
+
+ TEST_F(VoteRequesterDryRunTest, BadConfigVersionWinElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseConfigVersionDoesNotMatch());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ processResponse(requestFrom("host2"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, SetNameDiffersWinElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseSetNameDiffers());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ processResponse(requestFrom("host2"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, LastOpTimeIsGreaterWinElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseLastOpTimeIsGreater());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ processResponse(requestFrom("host2"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, FailedToContactWinElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), badResponseStatus());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got failed response from host1"));
+ processResponse(requestFrom("host2"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, AlreadyVotedWinElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseAlreadyVoted());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ processResponse(requestFrom("host2"), votedYes());
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::SuccessfullyElected, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, StaleTermLoseElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseTermIsGreater());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::StaleTerm, getResult());
+ stopCapturingLogMessages();
+ }
+
+ TEST_F(VoteRequesterDryRunTest, NotEnoughVotesLoseElection) {
+ startCapturingLogMessages();
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ processResponse(requestFrom("host1"), votedNoBecauseSetNameDiffers());
+ ASSERT_FALSE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got no vote from host1"));
+ processResponse(requestFrom("host2"), badResponseStatus());
+ ASSERT_EQUALS(1, countLogLinesContaining("Got failed response from host2"));
+ ASSERT_TRUE(hasReceivedSufficientResponses());
+ ASSERT_EQUALS(VoteRequester::InsufficientVotes, getResult());
+ stopCapturingLogMessages();
+ }
+
} // namespace
} // namespace repl
} // namespace mongo