diff options
Diffstat (limited to 'src/mongo/db/repl/member_config_test.cpp')
-rw-r--r-- | src/mongo/db/repl/member_config_test.cpp | 733 |
1 files changed, 411 insertions, 322 deletions
diff --git a/src/mongo/db/repl/member_config_test.cpp b/src/mongo/db/repl/member_config_test.cpp index 6411156f4f8..c53556f411d 100644 --- a/src/mongo/db/repl/member_config_test.cpp +++ b/src/mongo/db/repl/member_config_test.cpp @@ -38,328 +38,417 @@ namespace mongo { namespace repl { namespace { - TEST(MemberConfig, ParseMinimalMemberConfigAndCheckDefaults) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "localhost:12345"), - &tagConfig)); - ASSERT_EQUALS(0, mc.getId()); - ASSERT_EQUALS(HostAndPort("localhost", 12345), mc.getHostAndPort()); - ASSERT_EQUALS(1.0, mc.getPriority()); - ASSERT_EQUALS(Seconds(0), mc.getSlaveDelay()); - ASSERT_TRUE(mc.isVoter()); - ASSERT_FALSE(mc.isHidden()); - ASSERT_FALSE(mc.isArbiter()); - ASSERT_TRUE(mc.shouldBuildIndexes()); - ASSERT_EQUALS(3U, mc.getNumTags()); - ASSERT_OK(mc.validate()); - } - - TEST(MemberConfig, ParseFailsWithIllegalFieldName) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_EQUALS(ErrorCodes::BadValue, - mc.initialize(BSON("_id" << 0 << "host" << "localhost" << "frim" << 1), - &tagConfig)); - } - - TEST(MemberConfig, ParseFailsWithMissingIdField) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_EQUALS(ErrorCodes::NoSuchKey, mc.initialize(BSON("host" << "localhost:12345"), - &tagConfig)); - } - - TEST(MemberConfig, ParseFailsWithBadIdField) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_EQUALS(ErrorCodes::NoSuchKey, mc.initialize(BSON("host" << "localhost:12345"), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::TypeMismatch, - mc.initialize(BSON("_id" << "0" << "host" << "localhost:12345"), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::TypeMismatch, - mc.initialize(BSON("_id" << Date_t() << "host" << "localhost:12345"), - &tagConfig)); - } - - TEST(MemberConfig, ParseFailsWithMissingHostField) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_EQUALS(ErrorCodes::NoSuchKey, mc.initialize(BSON("_id" << 0), &tagConfig)); - } - - - TEST(MemberConfig, ParseFailsWithBadHostField) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_EQUALS(ErrorCodes::TypeMismatch, mc.initialize(BSON("_id" << 0 << "host" << 0), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::FailedToParse, mc.initialize(BSON("_id" << 0 << "host" << ""), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::FailedToParse, - mc.initialize(BSON("_id" << 0 << "host" << "myhost:zabc"), &tagConfig)); - } - - TEST(MemberConfig, ParseArbiterOnly) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "arbiterOnly" << 1.0), - &tagConfig)); - ASSERT_TRUE(mc.isArbiter()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "arbiterOnly" << false), - &tagConfig)); - ASSERT_TRUE(!mc.isArbiter()); - } - - TEST(MemberConfig, ParseHidden) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "hidden" << 1.0), - &tagConfig)); - ASSERT_TRUE(mc.isHidden()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "hidden" << false), - &tagConfig)); - ASSERT_TRUE(!mc.isHidden()); - ASSERT_EQUALS(ErrorCodes::TypeMismatch, - mc.initialize(BSON("_id" << 0 << "host" << "h" << "hidden" << "1.0"), - &tagConfig)); - } - - TEST(MemberConfig, ParseBuildIndexes) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "buildIndexes" << 1.0), - &tagConfig)); - ASSERT_TRUE(mc.shouldBuildIndexes()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "buildIndexes" << false), - &tagConfig)); - ASSERT_TRUE(!mc.shouldBuildIndexes()); - } - - TEST(MemberConfig, ParseVotes) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 1.0), - &tagConfig)); - ASSERT_TRUE(mc.isVoter()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 0), - &tagConfig)); - ASSERT_FALSE(mc.isVoter()); - - // For backwards compatibility, truncate 1.X to 1, and 0.X to 0 (and -0.X to 0). - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 1.5), - &tagConfig)); - ASSERT_TRUE(mc.isVoter()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 0.5), - &tagConfig)); - ASSERT_FALSE(mc.isVoter()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << -0.5), - &tagConfig)); - ASSERT_FALSE(mc.isVoter()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 2), - &tagConfig)); - - ASSERT_EQUALS(ErrorCodes::TypeMismatch, - mc.initialize(BSON("_id" << 0 << - "host" << "h" << - "votes" << Date_t::fromMillisSinceEpoch(2)), - &tagConfig)); - } - - TEST(MemberConfig, ParsePriority) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1), - &tagConfig)); - ASSERT_EQUALS(1.0, mc.getPriority()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0), - &tagConfig)); - ASSERT_EQUALS(0.0, mc.getPriority()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 100.8), - &tagConfig)); - ASSERT_EQUALS(100.8, mc.getPriority()); - - ASSERT_EQUALS(ErrorCodes::TypeMismatch, - mc.initialize(BSON("_id" << 0 << - "host" << "h" << - "priority" << Date_t::fromMillisSinceEpoch(2)), - &tagConfig)); - } - - TEST(MemberConfig, ParseSlaveDelay) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "slaveDelay" << 100), - &tagConfig)); - ASSERT_EQUALS(Seconds(100), mc.getSlaveDelay()); - } - - TEST(MemberConfig, ParseTags) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << - "tags" << BSON("k1" << "v1" << "k2" << "v2")), - &tagConfig)); - ASSERT_EQUALS(5U, mc.getNumTags()); - ASSERT_EQUALS(5, std::distance(mc.tagsBegin(), mc.tagsEnd())); - ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("k1", "v1"))); - ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("k2", "v2"))); - ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$voter", - "0"))); - ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$electable", - "0"))); - ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$all", - "0"))); - } - - TEST(MemberConfig, ValidateFailsWithIdOutOfRange) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << -1 << "host" << "localhost:12345"), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 256 << "host" << "localhost:12345"), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } - - TEST(MemberConfig, ValidateVotes) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 1.0), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_TRUE(mc.isVoter()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 0), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_FALSE(mc.isVoter()); - - // For backwards compatibility, truncate 1.X to 1, and 0.X to 0 (and -0.X to 0). - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 1.5), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_TRUE(mc.isVoter()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 0.5), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_FALSE(mc.isVoter()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << -0.5), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_FALSE(mc.isVoter()); - - // Invalid values - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << 2), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "votes" << -1), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } - - TEST(MemberConfig, ValidatePriorityRanges) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1000), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << -1), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1001), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } - - TEST(MemberConfig, ValidateSlaveDelays) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0 << - "slaveDelay" << 0), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0 << - "slaveDelay" << 3600 * 10), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0 << - "slaveDelay" << -1), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 0 << - "slaveDelay" << 3600 * 24 * 400), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } - - TEST(MemberConfig, ValidatePriorityAndSlaveDelayRelationship) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1 << - "slaveDelay" << 60), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } - - TEST(MemberConfig, ValidatePriorityAndHiddenRelationship) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1 << - "hidden" << true), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1 << - "hidden" << false), - &tagConfig)); - ASSERT_OK(mc.validate()); - } - - TEST(MemberConfig, ValidatePriorityAndBuildIndexesRelationship) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1 << - "buildIndexes" << false), - &tagConfig)); - - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << "priority" << 1 << - "buildIndexes" << true), - &tagConfig)); - ASSERT_OK(mc.validate()); - } - - TEST(MemberConfig, ValidateArbiterVotesRelationship) { - ReplicaSetTagConfig tagConfig; - MemberConfig mc; - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << - "votes" << 1 << "arbiterOnly" << true), - &tagConfig)); - ASSERT_OK(mc.validate()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << - "votes" << 0 << "arbiterOnly" << false), - &tagConfig)); - ASSERT_OK(mc.validate()); - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << - "votes" << 1 << "arbiterOnly" << false), - &tagConfig)); - ASSERT_OK(mc.validate()); - - ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" << "h" << - "votes" << 0 << "arbiterOnly" << true), - &tagConfig)); - ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); - } +TEST(MemberConfig, ParseMinimalMemberConfigAndCheckDefaults) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "localhost:12345"), + &tagConfig)); + ASSERT_EQUALS(0, mc.getId()); + ASSERT_EQUALS(HostAndPort("localhost", 12345), mc.getHostAndPort()); + ASSERT_EQUALS(1.0, mc.getPriority()); + ASSERT_EQUALS(Seconds(0), mc.getSlaveDelay()); + ASSERT_TRUE(mc.isVoter()); + ASSERT_FALSE(mc.isHidden()); + ASSERT_FALSE(mc.isArbiter()); + ASSERT_TRUE(mc.shouldBuildIndexes()); + ASSERT_EQUALS(3U, mc.getNumTags()); + ASSERT_OK(mc.validate()); +} + +TEST(MemberConfig, ParseFailsWithIllegalFieldName) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_EQUALS(ErrorCodes::BadValue, + mc.initialize(BSON("_id" << 0 << "host" + << "localhost" + << "frim" << 1), + &tagConfig)); +} + +TEST(MemberConfig, ParseFailsWithMissingIdField) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_EQUALS(ErrorCodes::NoSuchKey, + mc.initialize(BSON("host" + << "localhost:12345"), + &tagConfig)); +} + +TEST(MemberConfig, ParseFailsWithBadIdField) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_EQUALS(ErrorCodes::NoSuchKey, + mc.initialize(BSON("host" + << "localhost:12345"), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" + << "0" + << "host" + << "localhost:12345"), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" << Date_t() << "host" + << "localhost:12345"), + &tagConfig)); +} + +TEST(MemberConfig, ParseFailsWithMissingHostField) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_EQUALS(ErrorCodes::NoSuchKey, mc.initialize(BSON("_id" << 0), &tagConfig)); +} + + +TEST(MemberConfig, ParseFailsWithBadHostField) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" << 0 << "host" << 0), &tagConfig)); + ASSERT_EQUALS(ErrorCodes::FailedToParse, + mc.initialize(BSON("_id" << 0 << "host" + << ""), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::FailedToParse, + mc.initialize(BSON("_id" << 0 << "host" + << "myhost:zabc"), + &tagConfig)); +} + +TEST(MemberConfig, ParseArbiterOnly) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "arbiterOnly" << 1.0), + &tagConfig)); + ASSERT_TRUE(mc.isArbiter()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "arbiterOnly" << false), + &tagConfig)); + ASSERT_TRUE(!mc.isArbiter()); +} + +TEST(MemberConfig, ParseHidden) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "hidden" << 1.0), + &tagConfig)); + ASSERT_TRUE(mc.isHidden()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "hidden" << false), + &tagConfig)); + ASSERT_TRUE(!mc.isHidden()); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "hidden" + << "1.0"), + &tagConfig)); +} + +TEST(MemberConfig, ParseBuildIndexes) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "buildIndexes" << 1.0), + &tagConfig)); + ASSERT_TRUE(mc.shouldBuildIndexes()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "buildIndexes" << false), + &tagConfig)); + ASSERT_TRUE(!mc.shouldBuildIndexes()); +} + +TEST(MemberConfig, ParseVotes) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1.0), + &tagConfig)); + ASSERT_TRUE(mc.isVoter()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0), + &tagConfig)); + ASSERT_FALSE(mc.isVoter()); + + // For backwards compatibility, truncate 1.X to 1, and 0.X to 0 (and -0.X to 0). + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1.5), + &tagConfig)); + ASSERT_TRUE(mc.isVoter()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0.5), + &tagConfig)); + ASSERT_FALSE(mc.isVoter()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << -0.5), + &tagConfig)); + ASSERT_FALSE(mc.isVoter()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 2), + &tagConfig)); + + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << Date_t::fromMillisSinceEpoch(2)), + &tagConfig)); +} + +TEST(MemberConfig, ParsePriority) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1), + &tagConfig)); + ASSERT_EQUALS(1.0, mc.getPriority()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0), + &tagConfig)); + ASSERT_EQUALS(0.0, mc.getPriority()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 100.8), + &tagConfig)); + ASSERT_EQUALS(100.8, mc.getPriority()); + + ASSERT_EQUALS(ErrorCodes::TypeMismatch, + mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << Date_t::fromMillisSinceEpoch(2)), + &tagConfig)); +} + +TEST(MemberConfig, ParseSlaveDelay) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "slaveDelay" << 100), + &tagConfig)); + ASSERT_EQUALS(Seconds(100), mc.getSlaveDelay()); +} + +TEST(MemberConfig, ParseTags) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "tags" << BSON("k1" + << "v1" + << "k2" + << "v2")), + &tagConfig)); + ASSERT_EQUALS(5U, mc.getNumTags()); + ASSERT_EQUALS(5, std::distance(mc.tagsBegin(), mc.tagsEnd())); + ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("k1", "v1"))); + ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("k2", "v2"))); + ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$voter", "0"))); + ASSERT_EQUALS(1, + std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$electable", "0"))); + ASSERT_EQUALS(1, std::count(mc.tagsBegin(), mc.tagsEnd(), tagConfig.findTag("$all", "0"))); +} + +TEST(MemberConfig, ValidateFailsWithIdOutOfRange) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << -1 << "host" + << "localhost:12345"), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 256 << "host" + << "localhost:12345"), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} + +TEST(MemberConfig, ValidateVotes) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1.0), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_TRUE(mc.isVoter()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_FALSE(mc.isVoter()); + + // For backwards compatibility, truncate 1.X to 1, and 0.X to 0 (and -0.X to 0). + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1.5), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_TRUE(mc.isVoter()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0.5), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_FALSE(mc.isVoter()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << -0.5), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_FALSE(mc.isVoter()); + + // Invalid values + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 2), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << -1), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} + +TEST(MemberConfig, ValidatePriorityRanges) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1000), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << -1), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1001), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} + +TEST(MemberConfig, ValidateSlaveDelays) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0 << "slaveDelay" << 0), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0 << "slaveDelay" << 3600 * 10), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0 << "slaveDelay" << -1), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 0 << "slaveDelay" << 3600 * 24 * 400), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} + +TEST(MemberConfig, ValidatePriorityAndSlaveDelayRelationship) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1 << "slaveDelay" << 60), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} + +TEST(MemberConfig, ValidatePriorityAndHiddenRelationship) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1 << "hidden" << true), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1 << "hidden" << false), + &tagConfig)); + ASSERT_OK(mc.validate()); +} + +TEST(MemberConfig, ValidatePriorityAndBuildIndexesRelationship) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1 << "buildIndexes" << false), + &tagConfig)); + + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "priority" << 1 << "buildIndexes" << true), + &tagConfig)); + ASSERT_OK(mc.validate()); +} + +TEST(MemberConfig, ValidateArbiterVotesRelationship) { + ReplicaSetTagConfig tagConfig; + MemberConfig mc; + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1 << "arbiterOnly" << true), + &tagConfig)); + ASSERT_OK(mc.validate()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0 << "arbiterOnly" << false), + &tagConfig)); + ASSERT_OK(mc.validate()); + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 1 << "arbiterOnly" << false), + &tagConfig)); + ASSERT_OK(mc.validate()); + + ASSERT_OK(mc.initialize(BSON("_id" << 0 << "host" + << "h" + << "votes" << 0 << "arbiterOnly" << true), + &tagConfig)); + ASSERT_EQUALS(ErrorCodes::BadValue, mc.validate()); +} } // namespace } // namespace repl |