diff options
Diffstat (limited to 'gnu/llvm/unittests/Support/Path.cpp')
| -rw-r--r-- | gnu/llvm/unittests/Support/Path.cpp | 164 |
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); |
