summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/Support/Path.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/unittests/Support/Path.cpp')
-rw-r--r--gnu/llvm/unittests/Support/Path.cpp164
1 files changed, 85 insertions, 79 deletions
diff --git a/gnu/llvm/unittests/Support/Path.cpp b/gnu/llvm/unittests/Support/Path.cpp
index dc5bfb8c7bd..97b77e2dfed 100644
--- a/gnu/llvm/unittests/Support/Path.cpp
+++ b/gnu/llvm/unittests/Support/Path.cpp
@@ -187,7 +187,7 @@ TEST(Support, Path) {
}
SmallString<32> Relative("foo.cpp");
- ASSERT_NO_ERROR(sys::fs::make_absolute("/root", Relative));
+ sys::fs::make_absolute("/root", Relative);
Relative[5] = '/'; // Fix up windows paths.
ASSERT_EQ("/root/foo.cpp", Relative);
}
@@ -347,35 +347,6 @@ TEST(Support, HomeDirectoryWithNoEnv) {
}
#endif
-TEST(Support, UserCacheDirectory) {
- SmallString<13> CacheDir;
- SmallString<20> CacheDir2;
- auto Status = path::user_cache_directory(CacheDir, "");
- EXPECT_TRUE(Status ^ CacheDir.empty());
-
- if (Status) {
- EXPECT_TRUE(path::user_cache_directory(CacheDir2, "")); // should succeed
- EXPECT_EQ(CacheDir, CacheDir2); // and return same paths
-
- EXPECT_TRUE(path::user_cache_directory(CacheDir, "A", "B", "file.c"));
- auto It = path::rbegin(CacheDir);
- EXPECT_EQ("file.c", *It);
- EXPECT_EQ("B", *++It);
- EXPECT_EQ("A", *++It);
- auto ParentDir = *++It;
-
- // Test Unicode: "<user_cache_dir>/(pi)r^2/aleth.0"
- EXPECT_TRUE(path::user_cache_directory(CacheDir2, "\xCF\x80r\xC2\xB2",
- "\xE2\x84\xB5.0"));
- auto It2 = path::rbegin(CacheDir2);
- EXPECT_EQ("\xE2\x84\xB5.0", *It2);
- EXPECT_EQ("\xCF\x80r\xC2\xB2", *++It2);
- auto ParentDir2 = *++It2;
-
- EXPECT_EQ(ParentDir, ParentDir2);
- }
-}
-
TEST(Support, TempDirectory) {
SmallString<32> TempDir;
path::system_temp_directory(false, TempDir);
@@ -545,6 +516,8 @@ TEST_F(FileSystemTest, RealPath) {
EXPECT_EQ(Expected, Actual);
SmallString<64> HomeDir;
+
+ // This can fail if $HOME is not set and getpwuid fails.
bool Result = llvm::sys::path::home_directory(HomeDir);
if (Result) {
ASSERT_NO_ERROR(fs::real_path(HomeDir, Expected));
@@ -557,6 +530,31 @@ TEST_F(FileSystemTest, RealPath) {
ASSERT_NO_ERROR(fs::remove_directories(Twine(TestDirectory) + "/test1"));
}
+TEST_F(FileSystemTest, ExpandTilde) {
+ SmallString<64> Expected;
+ SmallString<64> Actual;
+ SmallString<64> HomeDir;
+
+ // This can fail if $HOME is not set and getpwuid fails.
+ bool Result = llvm::sys::path::home_directory(HomeDir);
+ if (Result) {
+ fs::expand_tilde(HomeDir, Expected);
+
+ fs::expand_tilde("~", Actual);
+ EXPECT_EQ(Expected, Actual);
+
+#ifdef _WIN32
+ Expected += "\\foo";
+ fs::expand_tilde("~\\foo", Actual);
+#else
+ Expected += "/foo";
+ fs::expand_tilde("~/foo", Actual);
+#endif
+
+ EXPECT_EQ(Expected, Actual);
+ }
+}
+
#ifdef LLVM_ON_UNIX
TEST_F(FileSystemTest, RealPathNoReadPerm) {
SmallString<64> Expanded;
@@ -681,6 +679,37 @@ TEST_F(FileSystemTest, TempFiles) {
#endif
}
+TEST_F(FileSystemTest, TempFileCollisions) {
+ SmallString<128> TestDirectory;
+ ASSERT_NO_ERROR(
+ fs::createUniqueDirectory("CreateUniqueFileTest", TestDirectory));
+ FileRemover Cleanup(TestDirectory);
+ SmallString<128> Model = TestDirectory;
+ path::append(Model, "%.tmp");
+ SmallString<128> Path;
+ std::vector<fs::TempFile> TempFiles;
+
+ auto TryCreateTempFile = [&]() {
+ Expected<fs::TempFile> T = fs::TempFile::create(Model);
+ if (T) {
+ TempFiles.push_back(std::move(*T));
+ return true;
+ } else {
+ logAllUnhandledErrors(T.takeError(), errs(),
+ "Failed to create temporary file: ");
+ return false;
+ }
+ };
+
+ // We should be able to create exactly 16 temporary files.
+ for (int i = 0; i < 16; ++i)
+ EXPECT_TRUE(TryCreateTempFile());
+ EXPECT_FALSE(TryCreateTempFile());
+
+ for (fs::TempFile &T : TempFiles)
+ cantFail(T.discard());
+}
+
TEST_F(FileSystemTest, CreateDir) {
ASSERT_NO_ERROR(fs::create_directory(Twine(TestDirectory) + "foo"));
ASSERT_NO_ERROR(fs::create_directory(Twine(TestDirectory) + "foo"));
@@ -881,87 +910,62 @@ TEST_F(FileSystemTest, BrokenSymlinkDirectoryIteration) {
v_t VisitedNonBrokenSymlinks;
v_t VisitedBrokenSymlinks;
std::error_code ec;
+ using testing::UnorderedElementsAre;
+ using testing::UnorderedElementsAreArray;
// Broken symbol links are expected to throw an error.
for (fs::directory_iterator i(Twine(TestDirectory) + "/symlink", ec), e;
i != e; i.increment(ec)) {
- if (ec == std::make_error_code(std::errc::no_such_file_or_directory)) {
+ ASSERT_NO_ERROR(ec);
+ if (i->status().getError() ==
+ std::make_error_code(std::errc::no_such_file_or_directory)) {
VisitedBrokenSymlinks.push_back(path::filename(i->path()));
continue;
}
-
- ASSERT_NO_ERROR(ec);
VisitedNonBrokenSymlinks.push_back(path::filename(i->path()));
}
- llvm::sort(VisitedNonBrokenSymlinks.begin(), VisitedNonBrokenSymlinks.end());
- llvm::sort(VisitedBrokenSymlinks.begin(), VisitedBrokenSymlinks.end());
- v_t ExpectedNonBrokenSymlinks = {"b", "d"};
- ASSERT_EQ(ExpectedNonBrokenSymlinks.size(), VisitedNonBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedNonBrokenSymlinks.begin(),
- VisitedNonBrokenSymlinks.end(),
- ExpectedNonBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedNonBrokenSymlinks, UnorderedElementsAre("b", "d"));
VisitedNonBrokenSymlinks.clear();
- v_t ExpectedBrokenSymlinks = {"a", "c", "e"};
- ASSERT_EQ(ExpectedBrokenSymlinks.size(), VisitedBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedBrokenSymlinks.begin(),
- VisitedBrokenSymlinks.end(),
- ExpectedBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedBrokenSymlinks, UnorderedElementsAre("a", "c", "e"));
VisitedBrokenSymlinks.clear();
// Broken symbol links are expected to throw an error.
for (fs::recursive_directory_iterator i(
Twine(TestDirectory) + "/symlink", ec), e; i != e; i.increment(ec)) {
- if (ec == std::make_error_code(std::errc::no_such_file_or_directory)) {
+ ASSERT_NO_ERROR(ec);
+ if (i->status().getError() ==
+ std::make_error_code(std::errc::no_such_file_or_directory)) {
VisitedBrokenSymlinks.push_back(path::filename(i->path()));
continue;
}
-
- ASSERT_NO_ERROR(ec);
VisitedNonBrokenSymlinks.push_back(path::filename(i->path()));
}
- llvm::sort(VisitedNonBrokenSymlinks.begin(), VisitedNonBrokenSymlinks.end());
- llvm::sort(VisitedBrokenSymlinks.begin(), VisitedBrokenSymlinks.end());
- ExpectedNonBrokenSymlinks = {"b", "bb", "d", "da", "dd", "ddd", "ddd"};
- ASSERT_EQ(ExpectedNonBrokenSymlinks.size(), VisitedNonBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedNonBrokenSymlinks.begin(),
- VisitedNonBrokenSymlinks.end(),
- ExpectedNonBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedNonBrokenSymlinks,
+ UnorderedElementsAre("b", "bb", "d", "da", "dd", "ddd", "ddd"));
VisitedNonBrokenSymlinks.clear();
- ExpectedBrokenSymlinks = {"a", "ba", "bc", "c", "e"};
- ASSERT_EQ(ExpectedBrokenSymlinks.size(), VisitedBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedBrokenSymlinks.begin(),
- VisitedBrokenSymlinks.end(),
- ExpectedBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedBrokenSymlinks,
+ UnorderedElementsAre("a", "ba", "bc", "c", "e"));
VisitedBrokenSymlinks.clear();
for (fs::recursive_directory_iterator i(
Twine(TestDirectory) + "/symlink", ec, /*follow_symlinks=*/false), e;
i != e; i.increment(ec)) {
- if (ec == std::make_error_code(std::errc::no_such_file_or_directory)) {
+ ASSERT_NO_ERROR(ec);
+ if (i->status().getError() ==
+ std::make_error_code(std::errc::no_such_file_or_directory)) {
VisitedBrokenSymlinks.push_back(path::filename(i->path()));
continue;
}
-
- ASSERT_NO_ERROR(ec);
VisitedNonBrokenSymlinks.push_back(path::filename(i->path()));
}
- llvm::sort(VisitedNonBrokenSymlinks.begin(), VisitedNonBrokenSymlinks.end());
- llvm::sort(VisitedBrokenSymlinks.begin(), VisitedBrokenSymlinks.end());
- ExpectedNonBrokenSymlinks = {"a", "b", "ba", "bb", "bc", "c", "d", "da", "dd",
- "ddd", "e"};
- ASSERT_EQ(ExpectedNonBrokenSymlinks.size(), VisitedNonBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedNonBrokenSymlinks.begin(),
- VisitedNonBrokenSymlinks.end(),
- ExpectedNonBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedNonBrokenSymlinks,
+ UnorderedElementsAreArray({"a", "b", "ba", "bb", "bc", "c", "d",
+ "da", "dd", "ddd", "e"}));
VisitedNonBrokenSymlinks.clear();
- ExpectedBrokenSymlinks = {};
- ASSERT_EQ(ExpectedBrokenSymlinks.size(), VisitedBrokenSymlinks.size());
- ASSERT_TRUE(std::equal(VisitedBrokenSymlinks.begin(),
- VisitedBrokenSymlinks.end(),
- ExpectedBrokenSymlinks.begin()));
+ EXPECT_THAT(VisitedBrokenSymlinks, UnorderedElementsAre());
VisitedBrokenSymlinks.clear();
ASSERT_NO_ERROR(fs::remove_directories(Twine(TestDirectory) + "/symlink"));
@@ -1266,7 +1270,7 @@ TEST_F(FileSystemTest, OpenFileForRead) {
ASSERT_NO_ERROR(sys::fs::openFileForWrite(Twine(TempPath), FileDescriptor,
fs::CD_OpenExisting));
TimePoint<> Epoch(std::chrono::milliseconds(0));
- ASSERT_NO_ERROR(fs::setLastModificationAndAccessTime(FileDescriptor, Epoch));
+ ASSERT_NO_ERROR(fs::setLastAccessAndModificationTime(FileDescriptor, Epoch));
::close(FileDescriptor);
// Open the file and ensure access time is updated, when forced.
@@ -1661,7 +1665,9 @@ TEST_F(FileSystemTest, permissions) {
EXPECT_TRUE(CheckPermissions(fs::set_gid_on_exe));
// Modern BSDs require root to set the sticky bit on files.
-#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
+ // AIX without root will mask off (i.e., lose) the sticky bit on files.
+#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && \
+ !defined(_AIX)
EXPECT_EQ(fs::setPermissions(TempPath, fs::sticky_bit), NoError);
EXPECT_TRUE(CheckPermissions(fs::sticky_bit));
@@ -1681,7 +1687,7 @@ TEST_F(FileSystemTest, permissions) {
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_perms), NoError);
EXPECT_TRUE(CheckPermissions(fs::all_perms));
-#endif // !FreeBSD && !NetBSD && !OpenBSD
+#endif // !FreeBSD && !NetBSD && !OpenBSD && !AIX
EXPECT_EQ(fs::setPermissions(TempPath, fs::all_perms & ~fs::sticky_bit),
NoError);