summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2016-11-28 19:55:44 -0500
committerBenety Goh <benety@mongodb.com>2016-11-28 19:55:44 -0500
commit5313489266e75c5d40d1b7aae382d3e3fc8997a0 (patch)
tree9d0995c05462c7dbed1c68c646ac601bc089f8ef /src/mongo/db/repl
parent647ebfac9ebf1c5fc431a2ba813bf9c97b9bdab9 (diff)
downloadmongo-5313489266e75c5d40d1b7aae382d3e3fc8997a0.tar.gz
SERVER-27052 moved SyncSourceSelectorMock to its own library
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r--src/mongo/db/repl/SConscript15
-rw-r--r--src/mongo/db/repl/data_replicator_test.cpp25
-rw-r--r--src/mongo/db/repl/sync_source_resolver_test.cpp130
-rw-r--r--src/mongo/db/repl/sync_source_selector_mock.cpp80
-rw-r--r--src/mongo/db/repl/sync_source_selector_mock.h99
5 files changed, 249 insertions, 100 deletions
diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript
index 383514fa7db..0ce2f74901d 100644
--- a/src/mongo/db/repl/SConscript
+++ b/src/mongo/db/repl/SConscript
@@ -770,11 +770,25 @@ env.Library(
],
)
+env.Library(
+ target='sync_source_selector_mock',
+ source=[
+ 'sync_source_selector_mock.cpp',
+ ],
+ LIBDEPS=[
+ 'optime',
+ '$BUILD_DIR/mongo/base',
+ '$BUILD_DIR/mongo/rpc/metadata',
+ '$BUILD_DIR/mongo/util/net/hostandport',
+ ],
+)
+
env.CppUnitTest(
target='sync_source_resolver_test',
source='sync_source_resolver_test.cpp',
LIBDEPS=[
'sync_source_resolver',
+ 'sync_source_selector_mock',
'$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
'$BUILD_DIR/mongo/unittest/task_executor_proxy',
],
@@ -1051,6 +1065,7 @@ env.CppUnitTest(
'data_replicator',
'data_replicator_external_state_mock',
'replication_executor_test_fixture',
+ 'sync_source_selector_mock',
'$BUILD_DIR/mongo/db/query/command_request_response',
'$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
'$BUILD_DIR/mongo/unittest/concurrency',
diff --git a/src/mongo/db/repl/data_replicator_test.cpp b/src/mongo/db/repl/data_replicator_test.cpp
index 3a451783597..08ff6cd744a 100644
--- a/src/mongo/db/repl/data_replicator_test.cpp
+++ b/src/mongo/db/repl/data_replicator_test.cpp
@@ -45,6 +45,7 @@
#include "mongo/db/repl/storage_interface_mock.h"
#include "mongo/db/repl/sync_source_resolver.h"
#include "mongo/db/repl/sync_source_selector.h"
+#include "mongo/db/repl/sync_source_selector_mock.h"
#include "mongo/db/repl/update_position_args.h"
#include "mongo/executor/network_interface_mock.h"
#include "mongo/executor/thread_pool_task_executor_test_fixture.h"
@@ -79,28 +80,6 @@ struct CollectionCloneInfo {
Status status{ErrorCodes::NotYetInitialized, ""};
};
-class SyncSourceSelectorMock : public SyncSourceSelector {
- MONGO_DISALLOW_COPYING(SyncSourceSelectorMock);
-
-public:
- SyncSourceSelectorMock(const HostAndPort& syncSource) : _syncSource(syncSource) {}
- void clearSyncSourceBlacklist() override {}
- HostAndPort chooseNewSyncSource(const OpTime& ot) override {
- HostAndPort result = _syncSource;
- return result;
- }
- void blacklistSyncSource(const HostAndPort& host, Date_t until) override {
- _blacklistedSource = host;
- }
- bool shouldChangeSyncSource(const HostAndPort& currentSource,
- const rpc::ReplSetMetadata& metadata) override {
- return false;
- }
-
- HostAndPort _syncSource;
- HostAndPort _blacklistedSource;
-};
-
class DataReplicatorTest : public executor::ThreadPoolExecutorTest, public SyncSourceSelector {
public:
DataReplicatorTest() {}
@@ -113,7 +92,7 @@ public:
void reset() {
_setMyLastOptime = [this](const OpTime& opTime) { _myLastOpTime = opTime; };
_myLastOpTime = OpTime();
- _syncSourceSelector.reset(new SyncSourceSelectorMock(HostAndPort("localhost", -1)));
+ _syncSourceSelector = stdx::make_unique<SyncSourceSelectorMock>();
}
// SyncSourceSelector
diff --git a/src/mongo/db/repl/sync_source_resolver_test.cpp b/src/mongo/db/repl/sync_source_resolver_test.cpp
index 1022ef54e26..82ae8ab528c 100644
--- a/src/mongo/db/repl/sync_source_resolver_test.cpp
+++ b/src/mongo/db/repl/sync_source_resolver_test.cpp
@@ -34,6 +34,7 @@
#include "mongo/db/namespace_string.h"
#include "mongo/db/repl/sync_source_resolver.h"
#include "mongo/db/repl/sync_source_selector.h"
+#include "mongo/db/repl/sync_source_selector_mock.h"
#include "mongo/executor/network_interface_mock.h"
#include "mongo/executor/thread_pool_task_executor_test_fixture.h"
#include "mongo/stdx/functional.h"
@@ -67,30 +68,6 @@ private:
ShouldFailRequestFn _shouldFailRequest;
};
-class SyncSourceSelectorMock : public SyncSourceSelector {
-public:
- void clearSyncSourceBlacklist() override {}
- HostAndPort chooseNewSyncSource(const OpTime& ot) override {
- chooseNewSyncSourceHook();
- lastOpTimeFetched = ot;
- return syncSource;
- }
- void blacklistSyncSource(const HostAndPort& host, Date_t until) override {
- blacklistHost = host;
- blacklistUntil = until;
- }
- bool shouldChangeSyncSource(const HostAndPort&, const rpc::ReplSetMetadata&) {
- return false;
- }
-
- HostAndPort syncSource = HostAndPort("host1", 1234);
- OpTime lastOpTimeFetched;
- stdx::function<void()> chooseNewSyncSourceHook = []() {};
-
- HostAndPort blacklistHost;
- Date_t blacklistUntil;
-};
-
class SyncSourceResolverTest : public executor::ThreadPoolExecutorTest {
private:
void setUp() override;
@@ -241,7 +218,7 @@ TEST_F(SyncSourceResolverTest, StartupReturnsIllegalOperationIfAlreadyActive) {
}
TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfResolverIsShuttingDown) {
- _selector->syncSource = HostAndPort("node1", 12345);
+ _selector->setChooseNewSyncSourceResult_forTest(HostAndPort("node1", 12345));
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(executor::NetworkInterfaceMock::InNetworkGuard(getNet())->hasReadyRequests());
_resolver->shutdown();
@@ -258,13 +235,13 @@ TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfExecutorIsShutd
TEST_F(SyncSourceResolverTest,
SyncSourceResolverReturnsStatusOkAndAnEmptyHostWhenNoViableHostExists) {
- _selector->syncSource = HostAndPort();
+ _selector->setChooseNewSyncSourceResult_forTest(HostAndPort());
ASSERT_OK(_resolver->startup());
// Resolver invokes callback with empty host and becomes inactive immediately.
ASSERT_FALSE(_resolver->isActive());
ASSERT_EQUALS(HostAndPort(), unittest::assertGet(_response.syncSourceStatus));
- ASSERT_EQUALS(lastOpTimeFetched, _selector->lastOpTimeFetched);
+ ASSERT_EQUALS(lastOpTimeFetched, _selector->getChooseNewSyncSourceOpTime_forTest());
// Cannot restart a completed resolver.
ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, _resolver->startup());
@@ -273,17 +250,16 @@ TEST_F(SyncSourceResolverTest,
TEST_F(
SyncSourceResolverTest,
SyncSourceResolverReturnsCallbackCanceledIfResolverIsShutdownBeforeReturningEmptySyncSource) {
- _selector->syncSource = HostAndPort();
- _selector->chooseNewSyncSourceHook = [this]() { _resolver->shutdown(); };
+ _selector->setChooseNewSyncSourceResult_forTest(HostAndPort());
+ _selector->setChooseNewSyncSourceHook_forTest([this]() { _resolver->shutdown(); });
ASSERT_EQUALS(ErrorCodes::CallbackCanceled, _resolver->startup());
ASSERT_EQUALS(ErrorCodes::CallbackCanceled, _response.syncSourceStatus);
}
TEST_F(SyncSourceResolverTest,
SyncSourceResolverConvertsExceptionToStatusIfChoosingViableSyncSourceThrowsException) {
- _selector->chooseNewSyncSourceHook = [this]() {
- uassert(ErrorCodes::InternalError, "", false);
- };
+ _selector->setChooseNewSyncSourceHook_forTest(
+ [this]() { uassert(ErrorCodes::InternalError, "", false); });
ASSERT_EQUALS(ErrorCodes::InternalError, _resolver->startup());
ASSERT_EQUALS(ErrorCodes::InternalError, _response.syncSourceStatus);
}
@@ -313,7 +289,7 @@ void _scheduleFirstOplogEntryFetcherResponse(executor::NetworkInterfaceMock* net
ASSERT_BSONOBJ_EQ(BSON("$natural" << 1), request.cmdObj.getObjectField("sort"));
// Change next sync source candidate before delivering scheduled response.
- selector->syncSource = nextSyncSource;
+ selector->setChooseNewSyncSourceResult_forTest(nextSyncSource);
net->runReadyNetworkOperations();
}
@@ -330,7 +306,7 @@ void _scheduleFirstOplogEntryFetcherResponse(executor::NetworkInterfaceMock* net
TEST_F(SyncSourceResolverTest,
SyncSourceResolverReturnsStatusOkAndTheFoundHostWhenAnEligibleSyncSourceExists) {
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -345,7 +321,7 @@ TEST_F(SyncSourceResolverTest,
TEST_F(SyncSourceResolverTest,
SyncSourceResolverTransitionsToCompleteWhenFinishCallbackThrowsException) {
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
_onCompletion = [this](const SyncSourceResolverResponse& response) {
_response = response;
uassert(ErrorCodes::InternalError, "", false);
@@ -391,7 +367,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeDoesNotHaveOldEnoughData) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -400,9 +376,9 @@ TEST_F(SyncSourceResolverTest,
getNet(), _selector.get(), candidate1, candidate2, Timestamp(200, 2));
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kTooStaleBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2));
@@ -417,7 +393,7 @@ TEST_F(SyncSourceResolverTest,
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
HostAndPort candidate3("node3", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -448,7 +424,7 @@ void _scheduleNetworkErrorForFirstNode(executor::NetworkInterfaceMock* net,
ASSERT_EQUALS(currentSyncSource, request.target);
// Change next sync source candidate before delivering error to callback.
- selector->syncSource = nextSyncSource;
+ selector->setChooseNewSyncSourceResult_forTest(nextSyncSource);
net->runReadyNetworkOperations();
}
@@ -457,7 +433,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasANetworkError) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -465,9 +441,9 @@ TEST_F(SyncSourceResolverTest,
_scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, candidate2);
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2));
@@ -480,7 +456,7 @@ TEST_F(SyncSourceResolverTest,
TEST_F(SyncSourceResolverTest,
SyncSourceResolverReturnsEmptyHostWhenNoViableNodeExistsAfterNetworkErrorOnFirstNode) {
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -488,9 +464,9 @@ TEST_F(SyncSourceResolverTest,
_scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, HostAndPort());
ASSERT_FALSE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
ASSERT_EQUALS(HostAndPort(), unittest::assertGet(_response.syncSourceStatus));
}
@@ -499,7 +475,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverReturnsScheduleErrorWhenTheSchedulingCommandToSecondNodeFails) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -511,9 +487,9 @@ TEST_F(SyncSourceResolverTest,
_scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, candidate2);
ASSERT_FALSE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
ASSERT_EQUALS(ErrorCodes::OperationFailed, _response.syncSourceStatus);
}
@@ -522,7 +498,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasAnEmptyOplog) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -530,9 +506,9 @@ TEST_F(SyncSourceResolverTest,
getNet(), _selector.get(), candidate1, candidate2, std::vector<BSONObj>());
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kOplogEmptyBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2));
@@ -546,7 +522,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasAnEmptyFirstOplogEntry) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -554,9 +530,9 @@ TEST_F(SyncSourceResolverTest,
getNet(), _selector.get(), candidate1, candidate2, {BSONObj()});
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFirstOplogEntryEmptyBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2));
@@ -570,7 +546,7 @@ TEST_F(SyncSourceResolverTest,
SyncSourceResolverWillTryOtherSourcesWhenFirstNodeContainsOplogEntryWithNullTimestamp) {
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -578,10 +554,10 @@ TEST_F(SyncSourceResolverTest,
getNet(), _selector.get(), candidate1, candidate2, Timestamp(0, 0));
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() +
SyncSourceResolver::kFirstOplogEntryNullTimestampBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2));
@@ -646,7 +622,7 @@ TEST_F(
_resolver = _makeResolver(lastOpTimeFetched, requiredOpTime);
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -668,7 +644,7 @@ TEST_F(SyncSourceResolverTest,
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -685,9 +661,9 @@ TEST_F(SyncSourceResolverTest,
{BSON("ts" << requiredOpTime.getTimestamp() << "t" << OpTime::kUninitializedTerm)});
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0));
@@ -707,7 +683,7 @@ TEST_F(
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -719,9 +695,9 @@ TEST_F(
_scheduleRequiredOpTimeFetcherResponse(getNet(), _selector.get(), candidate1, requiredOpTime);
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0));
@@ -739,7 +715,7 @@ TEST_F(SyncSourceResolverTest,
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -752,9 +728,9 @@ TEST_F(SyncSourceResolverTest,
getNet(), _selector.get(), candidate1, requiredOpTime, {});
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0));
@@ -771,7 +747,7 @@ TEST_F(SyncSourceResolverTest,
HostAndPort candidate1("node1", 12345);
HostAndPort candidate2("node2", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -788,9 +764,9 @@ TEST_F(SyncSourceResolverTest,
{BSON("ts" << requiredOpTime.getTimestamp() << "t" << requiredOpTime.getTerm() + 1)});
ASSERT_TRUE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_scheduleFirstOplogEntryFetcherResponse(
getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0));
@@ -810,7 +786,7 @@ TEST_F(SyncSourceResolverTest,
};
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -828,7 +804,7 @@ TEST_F(
_resolver = _makeResolver(lastOpTimeFetched, requiredOpTime);
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -851,7 +827,7 @@ TEST_F(
_resolver = _makeResolver(lastOpTimeFetched, requiredOpTime);
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -873,7 +849,7 @@ TEST_F(
_resolver = _makeResolver(lastOpTimeFetched, requiredOpTime);
HostAndPort candidate1("node1", 12345);
- _selector->syncSource = candidate1;
+ _selector->setChooseNewSyncSourceResult_forTest(candidate1);
ASSERT_OK(_resolver->startup());
ASSERT_TRUE(_resolver->isActive());
@@ -883,9 +859,9 @@ TEST_F(
_scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, HostAndPort());
ASSERT_FALSE(_resolver->isActive());
- ASSERT_EQUALS(candidate1, _selector->blacklistHost);
+ ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest());
ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration,
- _selector->blacklistUntil);
+ _selector->getLastBlacklistExpiration_forTest());
_resolver->join();
ASSERT_FALSE(_resolver->isActive());
diff --git a/src/mongo/db/repl/sync_source_selector_mock.cpp b/src/mongo/db/repl/sync_source_selector_mock.cpp
new file mode 100644
index 00000000000..0b697a2e234
--- /dev/null
+++ b/src/mongo/db/repl/sync_source_selector_mock.cpp
@@ -0,0 +1,80 @@
+/**
+ * Copyright (C) 2016 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#include "mongo/platform/basic.h"
+
+#include "mongo/db/repl/sync_source_selector_mock.h"
+
+namespace mongo {
+namespace repl {
+
+SyncSourceSelectorMock::SyncSourceSelectorMock() {}
+
+SyncSourceSelectorMock::~SyncSourceSelectorMock() {}
+
+void SyncSourceSelectorMock::clearSyncSourceBlacklist() {}
+
+HostAndPort SyncSourceSelectorMock::chooseNewSyncSource(const OpTime& ot) {
+ _chooseNewSyncSourceHook();
+ _chooseNewSyncSourceOpTime = ot;
+ return _chooseNewSyncSourceResult;
+}
+
+void SyncSourceSelectorMock::blacklistSyncSource(const HostAndPort& host, Date_t until) {
+ _lastBlacklistedSyncSource = host;
+ _lastBlacklistExpiration = until;
+}
+
+void SyncSourceSelectorMock::setChooseNewSyncSourceHook_forTest(
+ const ChooseNewSyncSourceHook& hook) {
+ _chooseNewSyncSourceHook = hook;
+}
+
+bool SyncSourceSelectorMock::shouldChangeSyncSource(const HostAndPort&,
+ const rpc::ReplSetMetadata&) {
+ return false;
+}
+
+void SyncSourceSelectorMock::setChooseNewSyncSourceResult_forTest(const HostAndPort& syncSource) {
+ _chooseNewSyncSourceResult = syncSource;
+}
+
+OpTime SyncSourceSelectorMock::getChooseNewSyncSourceOpTime_forTest() const {
+ return _chooseNewSyncSourceOpTime;
+}
+
+HostAndPort SyncSourceSelectorMock::getLastBlacklistedSyncSource_forTest() const {
+ return _lastBlacklistedSyncSource;
+}
+
+Date_t SyncSourceSelectorMock::getLastBlacklistExpiration_forTest() const {
+ return _lastBlacklistExpiration;
+}
+
+} // namespace repl
+} // namespace mongo
diff --git a/src/mongo/db/repl/sync_source_selector_mock.h b/src/mongo/db/repl/sync_source_selector_mock.h
new file mode 100644
index 00000000000..b53dfb6dd49
--- /dev/null
+++ b/src/mongo/db/repl/sync_source_selector_mock.h
@@ -0,0 +1,99 @@
+/**
+ * Copyright (C) 2016 MongoDB Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the GNU Affero General Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#pragma once
+
+#include "mongo/base/disallow_copying.h"
+#include "mongo/db/repl/optime.h"
+#include "mongo/db/repl/sync_source_selector.h"
+#include "mongo/stdx/functional.h"
+
+namespace mongo {
+namespace repl {
+
+/**
+ * Mock implementation of SyncSourceSelector interface for testing.
+ */
+class SyncSourceSelectorMock : public SyncSourceSelector {
+ MONGO_DISALLOW_COPYING(SyncSourceSelectorMock);
+
+public:
+ using ChooseNewSyncSourceHook = stdx::function<void()>;
+
+ SyncSourceSelectorMock();
+ virtual ~SyncSourceSelectorMock();
+
+ void clearSyncSourceBlacklist() override;
+ HostAndPort chooseNewSyncSource(const OpTime& ot) override;
+ void blacklistSyncSource(const HostAndPort& host, Date_t until) override;
+ bool shouldChangeSyncSource(const HostAndPort&, const rpc::ReplSetMetadata&) override;
+
+ /**
+ * Sets a function that will be run every time chooseNewSyncSource() is called.
+ */
+ void setChooseNewSyncSourceHook_forTest(const ChooseNewSyncSourceHook& hook);
+
+ /**
+ * Sets the result for subsequent chooseNewSyncSource() invocations.
+ */
+ void setChooseNewSyncSourceResult_forTest(const HostAndPort&);
+
+ /**
+ * Returns most recent optime passed to chooseNewSyncSource().
+ */
+ OpTime getChooseNewSyncSourceOpTime_forTest() const;
+
+ /**
+ * Returns most recently blacklisted sync source.
+ */
+ HostAndPort getLastBlacklistedSyncSource_forTest() const;
+
+ /**
+ * Returns the expiration associated with the most recently blacklisted sync source.
+ */
+ Date_t getLastBlacklistExpiration_forTest() const;
+
+private:
+ // This is the sync source that chooseNewSyncSource returns.
+ HostAndPort _chooseNewSyncSourceResult = HostAndPort("localhost", -1);
+
+ // This is the most recent optime passed to chooseNewSyncSource().
+ OpTime _chooseNewSyncSourceOpTime;
+
+ // This is run every time chooseNewSyncSource() is called.
+ ChooseNewSyncSourceHook _chooseNewSyncSourceHook = []() {};
+
+ // This is the most recently blacklisted sync source passed to blacklistSyncSource().
+ HostAndPort _lastBlacklistedSyncSource;
+
+ // This is the most recent 'util' argument value passed to blacklistSyncSource().
+ Date_t _lastBlacklistExpiration;
+};
+
+} // namespace repl
+} // namespace mongo