diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2020-12-04 08:13:42 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-01-03 11:56:04 +0000 |
commit | 5431150d116b70fc9401c46deaacc9ae049f064e (patch) | |
tree | d1784b3cb2355cee9401e539f4574f0172995d8d /src/mongo/db/s/dist_lock_catalog_mock.h | |
parent | 98a7731d21a8746e584f7092aadbee60a5fad6ef (diff) | |
download | mongo-5431150d116b70fc9401c46deaacc9ae049f064e.tar.gz |
SERVER-53227 Move the DistLockManager to only be available on MongoD
Diffstat (limited to 'src/mongo/db/s/dist_lock_catalog_mock.h')
-rw-r--r-- | src/mongo/db/s/dist_lock_catalog_mock.h | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/mongo/db/s/dist_lock_catalog_mock.h b/src/mongo/db/s/dist_lock_catalog_mock.h new file mode 100644 index 00000000000..04996f05633 --- /dev/null +++ b/src/mongo/db/s/dist_lock_catalog_mock.h @@ -0,0 +1,223 @@ +/** + * Copyright (C) 2018-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * 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 + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * 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 Server Side 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 <functional> + +#include "mongo/db/s/dist_lock_catalog.h" +#include "mongo/platform/mutex.h" +#include "mongo/s/catalog/type_lockpings.h" +#include "mongo/s/catalog/type_locks.h" + +namespace mongo { + +/** + * Mock implementation of DistLockCatalog for testing. + * + * Example usage: + * + * DistLockCatalogMock mock; + * LocksType badLock; + * mock.expectGrabLock([](StringData lockID, + * const OID& lockSessionID, + * StringData who, + * StringData processId, + * Date_t time, + * StringData why) { + * ASSERT_EQUALS("test", lockID); + * }, badLock); + * + * mock.grabLock("test", OID(), "me", "x", Date_t::now(), "end"); + * + * It is also possible to chain the callbacks. For example, if we want to set the test + * such that grabLock can only be called once, you can do this: + * + * DistLockCatalogMock mock; + * mock.expectGrabLock([&mock](...) { + * mock.expectNoGrabLock(); + * }, Status::OK()); + */ +class DistLockCatalogMock : public DistLockCatalog { +public: + DistLockCatalogMock(); + virtual ~DistLockCatalogMock(); + + using GrabLockFunc = std::function<void(StringData lockID, + const OID& lockSessionID, + StringData who, + StringData processId, + Date_t time, + StringData why)>; + using OvertakeLockFunc = std::function<void(StringData lockID, + const OID& lockSessionID, + const OID& currentHolderTS, + StringData who, + StringData processId, + Date_t time, + StringData why)>; + using UnlockFunc = std::function<void(const OID& lockSessionID)>; + using PingFunc = std::function<void(StringData processID, Date_t ping)>; + using StopPingFunc = std::function<void(StringData processID)>; + using GetPingFunc = StopPingFunc; + using GetLockByTSFunc = std::function<void(const OID& ts)>; + using GetLockByNameFunc = std::function<void(StringData name)>; + using GetServerInfoFunc = std::function<void()>; + + virtual StatusWith<LockpingsType> getPing(OperationContext* opCtx, + StringData processID) override; + + virtual Status ping(OperationContext* opCtx, StringData processID, Date_t ping) override; + + virtual StatusWith<LocksType> grabLock(OperationContext* opCtx, + StringData lockID, + const OID& lockSessionID, + StringData who, + StringData processId, + Date_t time, + StringData why, + const WriteConcernOptions& writeConcern) override; + + virtual StatusWith<LocksType> overtakeLock(OperationContext* opCtx, + StringData lockID, + const OID& lockSessionID, + const OID& currentHolderTS, + StringData who, + StringData processId, + Date_t time, + StringData why) override; + + virtual Status unlock(OperationContext* opCtx, const OID& lockSessionID) override; + + virtual Status unlock(OperationContext* opCtx, + const OID& lockSessionID, + StringData name) override; + + virtual Status unlockAll(OperationContext* opCtx, const std::string& processID) override; + + virtual StatusWith<ServerInfo> getServerInfo(OperationContext* opCtx) override; + + virtual StatusWith<LocksType> getLockByTS(OperationContext* opCtx, + const OID& lockSessionID) override; + + virtual StatusWith<LocksType> getLockByName(OperationContext* opCtx, StringData name) override; + + virtual Status stopPing(OperationContext* opCtx, StringData processId) override; + + /** + * Sets the checker method to use and the return value for grabLock to return every + * time it is called. + */ + void expectGrabLock(GrabLockFunc checkerFunc, StatusWith<LocksType> returnThis); + + /** + * Expect grabLock to never be called after this is called. + */ + void expectNoGrabLock(); + + /** + * Sets the checker method to use and the return value for unlock to return every + * time it is called. + */ + void expectUnLock(UnlockFunc checkerFunc, Status returnThis); + + /** + * Sets the checker method to use and its return value the every time ping is called. + */ + void expectPing(PingFunc checkerFunc, Status returnThis); + + /** + * Sets the checker method to use and its return value the every time stopPing is called. + */ + void expectStopPing(StopPingFunc checkerFunc, Status returnThis); + + /** + * Sets the checker method to use and its return value the every time + * getLockByTS is called. + */ + void expectGetLockByTS(GetLockByTSFunc checkerFunc, StatusWith<LocksType> returnThis); + + /** + * Sets the checker method to use and its return value the every time + * getLockByName is called. + */ + void expectGetLockByName(GetLockByNameFunc checkerFunc, StatusWith<LocksType> returnThis); + + /** + * Sets the checker method to use and its return value the every time + * overtakeLock is called. + */ + void expectOvertakeLock(OvertakeLockFunc checkerFunc, StatusWith<LocksType> returnThis); + + /** + * Sets the checker method to use and its return value the every time + * getPing is called. + */ + void expectGetPing(GetPingFunc checkerFunc, StatusWith<LockpingsType> returnThis); + + /** + * Sets the checker method to use and its return value the every time + * getServerInfo is called. + */ + void expectGetServerInfo(GetServerInfoFunc checkerFunc, + StatusWith<DistLockCatalog::ServerInfo> returnThis); + +private: + // Protects all the member variables. + Mutex _mutex = MONGO_MAKE_LATCH("DistLockCatalogMock::_mutex"); + + GrabLockFunc _grabLockChecker; + StatusWith<LocksType> _grabLockReturnValue; + + UnlockFunc _unlockChecker; + Status _unlockReturnValue; + + PingFunc _pingChecker; + Status _pingReturnValue; + + StopPingFunc _stopPingChecker; + Status _stopPingReturnValue; + + GetLockByTSFunc _getLockByTSChecker; + StatusWith<LocksType> _getLockByTSReturnValue; + + GetLockByNameFunc _getLockByNameChecker; + StatusWith<LocksType> _getLockByNameReturnValue; + + OvertakeLockFunc _overtakeLockChecker; + StatusWith<LocksType> _overtakeLockReturnValue; + + GetPingFunc _getPingChecker; + StatusWith<LockpingsType> _getPingReturnValue; + + GetServerInfoFunc _getServerInfoChecker; + StatusWith<DistLockCatalog::ServerInfo> _getServerInfoReturnValue; +}; + +} // namespace mongo |