diff options
Diffstat (limited to 'src/mongo/s')
-rw-r--r-- | src/mongo/s/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/s/catalog_cache.h | 8 | ||||
-rw-r--r-- | src/mongo/s/catalog_cache_mock.cpp | 61 | ||||
-rw-r--r-- | src/mongo/s/catalog_cache_mock.h | 64 |
4 files changed, 130 insertions, 4 deletions
diff --git a/src/mongo/s/SConscript b/src/mongo/s/SConscript index 1e7dfd571b5..b078f91ba3b 100644 --- a/src/mongo/s/SConscript +++ b/src/mongo/s/SConscript @@ -240,6 +240,7 @@ env.Library( source=[ 'sharding_test_fixture_common.cpp', 'catalog_cache_loader_mock.cpp', + 'catalog_cache_mock.cpp' ], LIBDEPS=[ '$BUILD_DIR/mongo/client/remote_command_targeter_mock', diff --git a/src/mongo/s/catalog_cache.h b/src/mongo/s/catalog_cache.h index 0d8143dbdbb..9dd31c65fa7 100644 --- a/src/mongo/s/catalog_cache.h +++ b/src/mongo/s/catalog_cache.h @@ -152,7 +152,7 @@ class CatalogCache { public: CatalogCache(ServiceContext* service, CatalogCacheLoader& cacheLoader); - ~CatalogCache(); + virtual ~CatalogCache(); /** * Blocking method that ensures the specified database is in the cache, loading it if necessary, @@ -186,9 +186,9 @@ public: * guaranteed to never return StaleClusterTime, because the latest routing information should * always be available. */ - StatusWith<ChunkManager> getCollectionRoutingInfo(OperationContext* opCtx, - const NamespaceString& nss, - bool allowLocks = false); + virtual StatusWith<ChunkManager> getCollectionRoutingInfo(OperationContext* opCtx, + const NamespaceString& nss, + bool allowLocks = false); /** * Same as getDatbase above, but in addition forces the database entry to be refreshed. diff --git a/src/mongo/s/catalog_cache_mock.cpp b/src/mongo/s/catalog_cache_mock.cpp new file mode 100644 index 00000000000..706b6a836d8 --- /dev/null +++ b/src/mongo/s/catalog_cache_mock.cpp @@ -0,0 +1,61 @@ +/** + * Copyright (C) 2021-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. + */ + +#include "mongo/s/catalog_cache_mock.h" +#include "mongo/db/service_context.h" +#include "mongo/s/catalog_cache_loader_mock.h" + +namespace mongo { + +const Status CatalogCacheMock::kChunkManagerInternalErrorStatus = { + ErrorCodes::InternalError, "Mocked catalog cache received unexpected chunks manager"}; + + +CatalogCacheMock::CatalogCacheMock(ServiceContext* serviceContext, CatalogCacheLoaderMock& loader) + : CatalogCache(serviceContext, loader) {} + +StatusWith<ChunkManager> CatalogCacheMock::getCollectionRoutingInfo(OperationContext* opCtx, + const NamespaceString& nss, + bool allowLocks) { + return _swChunkManagerReturnValue; +} + +void CatalogCacheMock::setChunkManagerReturnValue(StatusWith<ChunkManager> statusWithChunks) { + _swChunkManagerReturnValue = statusWithChunks; +} +void CatalogCacheMock::clearChunkManagerReturnValue() { + _swChunkManagerReturnValue = kChunkManagerInternalErrorStatus; +} + +std::unique_ptr<CatalogCacheMock> CatalogCacheMock::make() { + auto catalogCacheLoader = std::make_unique<CatalogCacheLoaderMock>(); + auto serviceContext = ServiceContext::make(); + return std::make_unique<CatalogCacheMock>(serviceContext.get(), *catalogCacheLoader); +} +} // namespace mongo diff --git a/src/mongo/s/catalog_cache_mock.h b/src/mongo/s/catalog_cache_mock.h new file mode 100644 index 00000000000..306529b60d3 --- /dev/null +++ b/src/mongo/s/catalog_cache_mock.h @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2021-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 "mongo/s/catalog_cache.h" +#include "mongo/s/catalog_cache_loader_mock.h" + +namespace mongo { + +/** + * Mocks the metadata refresh results with settable return values. The purpose of this class is to + * facilitate testing of classes that use a CatalogCacheLoader. + */ +class CatalogCacheMock final : public CatalogCache { + CatalogCacheMock(const CatalogCacheMock&) = delete; + CatalogCacheMock& operator=(const CatalogCacheMock&) = delete; + +public: + CatalogCacheMock(ServiceContext* context, CatalogCacheLoaderMock& loader); + ~CatalogCacheMock() = default; + + StatusWith<ChunkManager> getCollectionRoutingInfo(OperationContext* opCtx, + const NamespaceString& nss, + bool allowLocks) override; + + void setChunkManagerReturnValue(StatusWith<ChunkManager> statusWithChunks); + void clearChunkManagerReturnValue(); + + static std::unique_ptr<CatalogCacheMock> make(); + + static const Status kChunkManagerInternalErrorStatus; + +private: + StatusWith<ChunkManager> _swChunkManagerReturnValue{kChunkManagerInternalErrorStatus}; +}; + +} // namespace mongo |