diff options
author | jannaerin <golden.janna@gmail.com> | 2022-06-14 14:57:45 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-06-14 16:36:58 +0000 |
commit | 66566c2abd31219d8ace67b4dce19621e49bf8ce (patch) | |
tree | 8973fb18da828ae66d6cdb08ff7cd4f8402e3c96 /src/mongo/db/database_name_test.cpp | |
parent | e7f4004be036eb1e009d54b913cebb140d6182c1 (diff) | |
download | mongo-66566c2abd31219d8ace67b4dce19621e49bf8ce.tar.gz |
SERVER-66963 Improve performance of NamespaceString and DatabaseName construction
Diffstat (limited to 'src/mongo/db/database_name_test.cpp')
-rw-r--r-- | src/mongo/db/database_name_test.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mongo/db/database_name_test.cpp b/src/mongo/db/database_name_test.cpp new file mode 100644 index 00000000000..88436c5d3f1 --- /dev/null +++ b/src/mongo/db/database_name_test.cpp @@ -0,0 +1,155 @@ +/** + * Copyright (C) 2022-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/db/database_name.h" +#include "mongo/db/server_feature_flags_gen.h" +#include "mongo/idl/server_parameter_test_util.h" +#include "mongo/unittest/death_test.h" +#include "mongo/unittest/unittest.h" + +namespace mongo { +namespace { + +TEST(DatabaseNameTest, MultitenancySupportDisabled) { + DatabaseName dbnWithoutTenant1(boost::none, "a"); + + ASSERT(!dbnWithoutTenant1.tenantId()); + ASSERT_EQUALS(std::string("a"), dbnWithoutTenant1.db()); + ASSERT_EQUALS(std::string("a"), dbnWithoutTenant1.toString()); + + TenantId tenantId(OID::gen()); + DatabaseName dbnWithTenant(tenantId, "a"); + ASSERT(dbnWithTenant.tenantId()); + ASSERT_EQUALS(tenantId, *dbnWithTenant.tenantId()); + ASSERT_EQUALS(std::string("a"), dbnWithTenant.db()); + ASSERT_EQUALS(std::string("a"), dbnWithTenant.toString()); + ASSERT_EQUALS(std::string(tenantId.toString() + "_a"), dbnWithTenant.toStringWithTenantId()); +} + +TEST(DatabaseNameTest, MultitenancySupportEnabledTenantIDNotRequired) { + // TODO SERVER-62114 remove this test case. + RAIIServerParameterControllerForTest multitenanyController("multitenancySupport", true); + + DatabaseName dbnWithoutTenant(boost::none, "a"); + ASSERT(!dbnWithoutTenant.tenantId()); + ASSERT_EQUALS(std::string("a"), dbnWithoutTenant.db()); + ASSERT_EQUALS(std::string("a"), dbnWithoutTenant.toString()); + + TenantId tenantId(OID::gen()); + DatabaseName dbnWithTenant(tenantId, "a"); + ASSERT(dbnWithTenant.tenantId()); + ASSERT_EQUALS(tenantId, *dbnWithTenant.tenantId()); + ASSERT_EQUALS(std::string("a"), dbnWithTenant.db()); + ASSERT_EQUALS(std::string("a"), dbnWithTenant.toString()); + ASSERT_EQUALS(std::string(tenantId.toString() + "_a"), dbnWithTenant.toStringWithTenantId()); +} + +/* +// TODO SERVER-65457 Re-enable these tests + +DEATH_TEST(DatabaseNameTest, TenantIDRequiredNoTenantIdAssigned, "invariant") { + RAIIServerParameterControllerForTest multitenanyController("multitenancySupport", true); + + DatabaseName dbnWithoutTenant(boost::none, "a"); +} + +TEST(DatabaseNameTest, TenantIDRequiredBasic) { + RAIIServerParameterControllerForTest multitenanyController("multitenancySupport", true); + // TODO SERVER-62114 Remove enabling this feature flag. + RAIIServerParameterControllerForTest featureFlagController("featureFlagRequireTenantID", true); + + TenantId tenantId(OID::gen()); + DatabaseName dbn(tenantId, "a"); + ASSERT(dbn.tenantId()); + ASSERT_EQUALS(tenantId, *dbn.tenantId()); + ASSERT_EQUALS(std::string("a"), dbn.db()); + ASSERT_EQUALS(std::string(tenantId.toString() + "_a"), dbn.toString()); +} +*/ + +TEST(DatabaseNameTest, VerifyEqualsOperator) { + TenantId tenantId(OID::gen()); + DatabaseName dbn(tenantId, "a"); + ASSERT_TRUE(DatabaseName(tenantId, "a") == dbn); + ASSERT_TRUE(DatabaseName(tenantId, "b") != dbn); + + TenantId otherTenantId = TenantId(OID::gen()); + ASSERT_TRUE(DatabaseName(otherTenantId, "a") != dbn); + ASSERT_TRUE(DatabaseName(boost::none, "a") != dbn); +} + +TEST(DatabaseNameTest, VerifyHashFunction) { + TenantId tenantId1(OID::gen()); + TenantId tenantId2(OID::gen()); + DatabaseName dbn1 = DatabaseName(tenantId1, "a"); + DatabaseName dbn2 = DatabaseName(tenantId2, "a"); + DatabaseName dbn3 = DatabaseName(boost::none, "a"); + + stdx::unordered_map<DatabaseName, std::string> dbMap; + + dbMap[dbn1] = "value T1 a1"; + ASSERT_EQUALS(dbMap[dbn1], "value T1 a1"); + dbMap[dbn1] = "value T1 a2"; + ASSERT_EQUALS(dbMap[dbn1], "value T1 a2"); + dbMap[DatabaseName(tenantId1, "a")] = "value T1 a3"; + ASSERT_EQUALS(dbMap[dbn1], "value T1 a3"); + + dbMap[dbn2] = "value T2 a1"; + ASSERT_EQUALS(dbMap[dbn2], "value T2 a1"); + dbMap[dbn2] = "value T2 a2"; + + dbMap[dbn3] = "value no tenant a1"; + ASSERT_EQUALS(dbMap[dbn3], "value no tenant a1"); + dbMap[dbn3] = "value no tenant a2"; + + // verify all key-value in map to ensure all data is correct. + ASSERT_EQUALS(dbMap[dbn1], "value T1 a3"); + ASSERT_EQUALS(dbMap[dbn2], "value T2 a2"); + ASSERT_EQUALS(dbMap[dbn3], "value no tenant a2"); +} + +TEST(DatabaseNameTest, VerifyCompareFunction) { + TenantId tenantId1 = TenantId(OID::gen()); + TenantId tenantId2 = TenantId(OID::gen()); + + // OID's generated by the same process are monotonically increasing. + ASSERT(tenantId1 < tenantId2); + + DatabaseName dbn1a = DatabaseName(tenantId1, "a"); + DatabaseName dbn1b = DatabaseName(tenantId1, "b"); + DatabaseName dbn2a = DatabaseName(tenantId2, "a"); + DatabaseName dbn3a = DatabaseName(boost::none, "a"); + + ASSERT(dbn1a < dbn1b); + ASSERT(dbn1b < dbn2a); + ASSERT(dbn3a != dbn1a); + ASSERT(dbn1a != dbn2a); +} +} // namespace +} // namespace mongo |