summaryrefslogtreecommitdiff
path: root/src/mongo/db/namespace_string_test.cpp
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2017-05-17 02:43:20 -0400
committerBenety Goh <benety@mongodb.com>2017-05-18 10:42:17 -0400
commit4e6736dd8def2d0643a657d1900c38e491592abb (patch)
tree4a2b0f753767d6a6c890a0db7cd7c100995f2cf1 /src/mongo/db/namespace_string_test.cpp
parent2cafeb2f1f18b7986cbd0d6cf23cbadbdcd54b2b (diff)
downloadmongo-4e6736dd8def2d0643a657d1900c38e491592abb.tar.gz
SERVER-29251 add NamespaceString support for drop-pending collection namespaces
Diffstat (limited to 'src/mongo/db/namespace_string_test.cpp')
-rw-r--r--src/mongo/db/namespace_string_test.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/mongo/db/namespace_string_test.cpp b/src/mongo/db/namespace_string_test.cpp
index 3e4b489b508..9de487b1327 100644
--- a/src/mongo/db/namespace_string_test.cpp
+++ b/src/mongo/db/namespace_string_test.cpp
@@ -30,6 +30,7 @@
#include "mongo/unittest/unittest.h"
#include "mongo/db/namespace_string.h"
+#include "mongo/db/repl/optime.h"
namespace mongo {
@@ -208,6 +209,90 @@ TEST(NamespaceStringTest, GetTargetNSForGloballyManagedNamespace) {
NamespaceString{"test.$cmd.otherCommand"}.getTargetNSForGloballyManagedNamespace());
}
+TEST(NamespaceStringTest, IsDropPendingNamespace) {
+ ASSERT_TRUE(NamespaceString{"test.system.drop.0i0t-1.foo"}.isDropPendingNamespace());
+ ASSERT_TRUE(NamespaceString{"test.system.drop.1234567i8t9.foo"}.isDropPendingNamespace());
+ ASSERT_TRUE(NamespaceString{"test.system.drop.1234.foo"}.isDropPendingNamespace());
+ ASSERT_TRUE(NamespaceString{"test.system.drop.foo"}.isDropPendingNamespace());
+
+ ASSERT_FALSE(NamespaceString{"test.system.drop"}.isDropPendingNamespace());
+ ASSERT_FALSE(NamespaceString{"test.drop.1234.foo"}.isDropPendingNamespace());
+ ASSERT_FALSE(NamespaceString{"test.drop.foo"}.isDropPendingNamespace());
+ ASSERT_FALSE(NamespaceString{"test.foo"}.isDropPendingNamespace());
+ ASSERT_FALSE(NamespaceString{"test.$cmd"}.isDropPendingNamespace());
+
+ ASSERT_FALSE(NamespaceString{"$cmd.aggregate.foo"}.isDropPendingNamespace());
+ ASSERT_FALSE(NamespaceString{"$cmd.listCollections"}.isDropPendingNamespace());
+}
+
+TEST(NamespaceStringTest, MakeDropPendingNamespace) {
+ ASSERT_EQUALS(NamespaceString{"test.system.drop.0i0t-1.foo"},
+ NamespaceString{"test.foo"}.makeDropPendingNamespace(repl::OpTime()));
+ ASSERT_EQUALS(NamespaceString{"test.system.drop.1234567i8t9.foo"},
+ NamespaceString{"test.foo"}.makeDropPendingNamespace(
+ repl::OpTime(Timestamp(Seconds(1234567), 8U), 9LL)));
+ // If the collection name is too long to fit in the generated drop pending namespace, it will be
+ // truncated.
+ std::string dbName("test");
+ std::string collName(std::size_t(NamespaceString::MaxNsCollectionLen) - dbName.size() - 1, 't');
+ NamespaceString nss(dbName, collName);
+ auto dropPendingNss =
+ nss.makeDropPendingNamespace(repl::OpTime(Timestamp(Seconds(1234567), 8U), 9LL));
+ ASSERT_EQUALS(std::size_t(NamespaceString::MaxNsCollectionLen), dropPendingNss.size());
+}
+
+TEST(NamespaceStringTest, GetDropPendingNamespaceOpTime) {
+ // Null optime is acceptable.
+ ASSERT_EQUALS(
+ repl::OpTime(),
+ unittest::assertGet(
+ NamespaceString{"test.system.drop.0i0t-1.foo"}.getDropPendingNamespaceOpTime()));
+
+ // Valid optime.
+ ASSERT_EQUALS(
+ repl::OpTime(Timestamp(Seconds(1234567), 8U), 9LL),
+ unittest::assertGet(
+ NamespaceString{"test.system.drop.1234567i8t9.foo"}.getDropPendingNamespaceOpTime()));
+
+ // Original collection name is optional.
+ ASSERT_EQUALS(
+ repl::OpTime(Timestamp(Seconds(1234567), 8U), 9LL),
+ unittest::assertGet(
+ NamespaceString{"test.system.drop.1234567i8t9"}.getDropPendingNamespaceOpTime()));
+
+ // No system.drop. prefix.
+ ASSERT_EQUALS(ErrorCodes::BadValue,
+ NamespaceString{"test.1234.foo"}.getDropPendingNamespaceOpTime());
+
+ // Missing 'i' separator.
+ ASSERT_EQUALS(ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.1234t8.foo"}.getDropPendingNamespaceOpTime());
+
+ // Missing 't' separator.
+ ASSERT_EQUALS(ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.1234i56.foo"}.getDropPendingNamespaceOpTime());
+
+ // Timestamp seconds is not a number.
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.wwwi56t123.foo"}.getDropPendingNamespaceOpTime());
+
+ // Timestamp increment is not a number.
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.1234iaaat123.foo"}.getDropPendingNamespaceOpTime());
+
+ // Timestamp increment must be an unsigned number.
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.1234i-100t123.foo"}.getDropPendingNamespaceOpTime());
+
+ // Term is not a number.
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ NamespaceString{"test.system.drop.1234i111taaa.foo"}.getDropPendingNamespaceOpTime());
+}
+
TEST(NamespaceStringTest, CollectionComponentValidNames) {
ASSERT(NamespaceString::validCollectionComponent("a.b"));
ASSERT(NamespaceString::validCollectionComponent("a.b"));