summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/rename_collection_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/catalog/rename_collection_test.cpp')
-rw-r--r--src/mongo/db/catalog/rename_collection_test.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/mongo/db/catalog/rename_collection_test.cpp b/src/mongo/db/catalog/rename_collection_test.cpp
index 02edeeade89..fa32ebaac77 100644
--- a/src/mongo/db/catalog/rename_collection_test.cpp
+++ b/src/mongo/db/catalog/rename_collection_test.cpp
@@ -32,6 +32,7 @@
#include "mongo/db/catalog/collection_catalog_entry.h"
#include "mongo/db/catalog/collection_options.h"
+#include "mongo/db/catalog/index_create.h"
#include "mongo/db/catalog/rename_collection.h"
#include "mongo/db/client.h"
#include "mongo/db/concurrency/write_conflict_exception.h"
@@ -229,6 +230,34 @@ bool _isTempCollection(OperationContext* opCtx, const NamespaceString& nss) {
return options.temp;
}
+/**
+ * Creates an index using the given index name with a bogus key spec.
+ */
+void _createIndex(OperationContext* opCtx,
+ const NamespaceString& nss,
+ const std::string& indexName) {
+ writeConflictRetry(opCtx, "_createIndex", nss.ns(), [=] {
+ AutoGetCollection autoColl(opCtx, nss, MODE_X);
+ auto collection = autoColl.getCollection();
+ ASSERT_TRUE(collection) << "Cannot create index in collection " << nss
+ << " because collection " << nss.ns() << " does not exist.";
+
+ auto indexInfoObj = BSON(
+ "v" << int(IndexDescriptor::kLatestIndexVersion) << "key" << BSON("a" << 1) << "name"
+ << indexName
+ << "ns"
+ << nss.ns());
+
+ MultiIndexBlock indexer(opCtx, collection);
+ ASSERT_OK(indexer.init(indexInfoObj).getStatus());
+ WriteUnitOfWork wuow(opCtx);
+ indexer.commit();
+ wuow.commit();
+ });
+
+ ASSERT_TRUE(AutoGetCollectionForRead(opCtx, nss).getCollection());
+}
+
TEST_F(RenameCollectionTest, RenameCollectionReturnsNamespaceNotFoundIfDatabaseDoesNotExist) {
ASSERT_FALSE(AutoGetDb(_opCtx.get(), _sourceNss.db(), MODE_X).getDb());
ASSERT_EQUALS(ErrorCodes::NamespaceNotFound,
@@ -244,6 +273,41 @@ TEST_F(RenameCollectionTest, RenameCollectionReturnsNotMasterIfNotPrimary) {
renameCollection(_opCtx.get(), _sourceNss, _targetNss, {}));
}
+TEST_F(RenameCollectionTest, IndexNameTooLongForTargetCollection) {
+ ASSERT_GREATER_THAN(_targetNssDifferentDb.size(), _sourceNss.size());
+ std::size_t longestIndexNameAllowedForSource =
+ NamespaceString::MaxNsLen - 2U /*strlen(".$")*/ - _sourceNss.size();
+ ASSERT_OK(_sourceNss.checkLengthForRename(longestIndexNameAllowedForSource));
+ ASSERT_EQUALS(ErrorCodes::InvalidLength,
+ _targetNssDifferentDb.checkLengthForRename(longestIndexNameAllowedForSource));
+
+ _createCollection(_opCtx.get(), _sourceNss);
+ const std::string indexName(longestIndexNameAllowedForSource, 'a');
+ _createIndex(_opCtx.get(), _sourceNss, indexName);
+ ASSERT_EQUALS(ErrorCodes::InvalidLength,
+ renameCollection(_opCtx.get(), _sourceNss, _targetNssDifferentDb, {}));
+}
+
+TEST_F(RenameCollectionTest, IndexNameTooLongForTemporaryCollectionForRenameAcrossDatabase) {
+ ASSERT_GREATER_THAN(_targetNssDifferentDb.size(), _sourceNss.size());
+ std::size_t longestIndexNameAllowedForTarget =
+ NamespaceString::MaxNsLen - 2U /*strlen(".$")*/ - _targetNssDifferentDb.size();
+ ASSERT_OK(_sourceNss.checkLengthForRename(longestIndexNameAllowedForTarget));
+ ASSERT_OK(_targetNssDifferentDb.checkLengthForRename(longestIndexNameAllowedForTarget));
+
+ // Using XXXXX to check namespace length. Each 'X' will be replaced by a random character in
+ // renameCollection().
+ const NamespaceString tempNss(_targetNssDifferentDb.getSisterNS("tmpXXXXX.renameCollection"));
+ ASSERT_EQUALS(ErrorCodes::InvalidLength,
+ tempNss.checkLengthForRename(longestIndexNameAllowedForTarget));
+
+ _createCollection(_opCtx.get(), _sourceNss);
+ const std::string indexName(longestIndexNameAllowedForTarget, 'a');
+ _createIndex(_opCtx.get(), _sourceNss, indexName);
+ ASSERT_EQUALS(ErrorCodes::InvalidLength,
+ renameCollection(_opCtx.get(), _sourceNss, _targetNssDifferentDb, {}));
+}
+
TEST_F(RenameCollectionTest, RenameCollectionAcrossDatabaseWithoutUuid) {
_createCollection(_opCtx.get(), _sourceNss);
ASSERT_OK(renameCollection(_opCtx.get(), _sourceNss, _targetNssDifferentDb, {}));