aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2023-06-13 16:09:07 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2023-06-13 16:09:07 +0300
commit601fdb1766899a5709c688c4dca97f39a4c7c012 (patch)
tree6b1f1feba60be6564d96bc96773ccff11e723f8a /util
parent915e9312e516b36debfbda26eb504bfe3a3bf257 (diff)
downloadydb-601fdb1766899a5709c688c4dca97f39a4c7c012.tar.gz
Intermediate changes
Diffstat (limited to 'util')
-rw-r--r--util/folder/path_ut.cpp130
1 files changed, 59 insertions, 71 deletions
diff --git a/util/folder/path_ut.cpp b/util/folder/path_ut.cpp
index 3c0e875a07..e450a88bae 100644
--- a/util/folder/path_ut.cpp
+++ b/util/folder/path_ut.cpp
@@ -831,79 +831,67 @@ Y_UNIT_TEST_SUITE(TFsPathTests) {
UNIT_ASSERT_VALUES_EQUAL(path1.PathSplit().at(1), "file_in_folder_2");
}
- static constexpr TStringBuf a("a");
- static constexpr TStringBuf b("b");
- static constexpr TStringBuf c("c");
- static constexpr size_t n = 64;
- static const TString an(n, 'a');
- static const TString bn(n, 'b');
- static const TString cn(n, 'c');
-
- Y_UNIT_TEST(TestCopySplitSSOSupport) {
- TFsPath path1 = TFsPath(a) / TFsPath(b);
- const auto& split1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(0), a);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(1), b);
- TFsPath path2(static_cast<const TFsPath&>(path1)); // copy constructor
- const auto& split2 = path2.PathSplit();
- path1 = TFsPath(c); // invalidate previous Path_ in path1
- const auto& newsplit1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), c);
- UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(0), a);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(1), b);
- }
-
- Y_UNIT_TEST(TestMoveSplitSSOSupport) {
- TFsPath path1 = TFsPath(a) / TFsPath(b);
- const auto& split1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(0), a);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(1), b);
- TFsPath path2(std::move(path1)); // move constructor
- const auto& split2 = path2.PathSplit();
- path1 = TFsPath(c); // invalidate previous Path_ in path1
- const auto& newsplit1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), c);
- UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(0), a);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(1), b);
+#ifdef TSTRING_IS_STD_STRING
+ Y_UNIT_TEST(TestCopySplitSSO) {
+ // Summary length of path must be less minimal SSO length 19 bytes
+ constexpr TStringBuf A("a");
+ constexpr TStringBuf B("b");
+ constexpr TStringBuf C("c");
+ for (auto constructorType = 0; constructorType < 2; ++constructorType) {
+ TFsPath path1 = TFsPath(A) / TFsPath(B);
+ const auto& split1 = path1.PathSplit();
+ // Check split of path1
+ UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(split1.at(0), A);
+ UNIT_ASSERT_VALUES_EQUAL(split1.at(1), B);
+ TFsPath path2;
+ if (constructorType == 0) { // copy
+ path2 = TFsPath(path1); // copy constructor
+ } else if (constructorType == 1) { // move
+ path2 = TFsPath(std::move(path1)); // move constructor
+ }
+ const auto& split2 = path2.PathSplit();
+ path1 = TFsPath(C); // invalidate previous Path_ in path1
+ const auto& newsplit1 = path1.PathSplit();
+ // Check that split of path1 was overwrited (invalidate previous TStringBuf)
+ UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), C);
+ // Check split of path2 without segfault
+ UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(split2.at(0), A);
+ UNIT_ASSERT_VALUES_EQUAL(split2.at(1), B);
+ }
}
+#endif
Y_UNIT_TEST(TestCopySplitNoneSSO) {
- TFsPath path1 = TFsPath(an) / TFsPath(bn);
- const auto& split1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(0), an);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(1), bn);
- TFsPath path2(static_cast<const TFsPath&>(path1)); // copy constructor
- const auto& split2 = path2.PathSplit();
- path1 = TFsPath(cn); // invalidate previous Path_ in path1
- const auto& newsplit1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), cn);
- UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(0), an);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(1), bn);
- }
-
- Y_UNIT_TEST(TestMoveSplitNoneSSO) {
- TFsPath path1 = TFsPath(an) / TFsPath(bn);
- const auto& split1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(0), an);
- UNIT_ASSERT_VALUES_EQUAL(split1.at(1), bn);
- TFsPath path2(std::move(path1)); // move constructor
- const auto& split2 = path2.PathSplit();
- path1 = TFsPath(cn); // invalidate previous Path_ in path1
- const auto& newsplit1 = path1.PathSplit();
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
- UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), cn);
- UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(0), an);
- UNIT_ASSERT_VALUES_EQUAL(split2.at(1), bn);
+ // Lenght of directory name must overhead SSO length 19-23 bytes
+ const TString DIR_A = TString("Dir") + TString(32, 'A');
+ const TString DIR_B = TString("Dir") + TString(64, 'B');
+ const TString DIR_C = TString("Dir") + TString(128, 'C');
+ for (auto constructorType = 0; constructorType < 2; ++constructorType) {
+ TFsPath path1 = TFsPath(DIR_A) / TFsPath(DIR_B);
+ auto& split1 = path1.PathSplit();
+ // Check split of path1
+ UNIT_ASSERT_VALUES_EQUAL(split1.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(split1.at(0), DIR_A);
+ UNIT_ASSERT_VALUES_EQUAL(split1.at(1), DIR_B);
+ TFsPath path2;
+ if (constructorType == 0) { // copy
+ path2 = TFsPath(path1); // copy constructor
+ } else if (constructorType == 1) { // move
+ path2 = TFsPath(std::move(path1)); // move constructor
+ }
+ const auto& split2 = path2.PathSplit();
+ path1 = TFsPath(DIR_C); // invalidate previous Path_ in path1
+ const auto& newsplit1 = path1.PathSplit();
+ // Check that split of path1 was overwrited (invalidate previous TStringBuf)
+ UNIT_ASSERT_VALUES_EQUAL(newsplit1.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(newsplit1.at(0), DIR_C);
+ // Check split of path2 without segfault
+ UNIT_ASSERT_VALUES_EQUAL(split2.size(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(split2.at(0), DIR_A);
+ UNIT_ASSERT_VALUES_EQUAL(split2.at(1), DIR_B);
+ }
}
}