summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Support/Path.cpp
diff options
context:
space:
mode:
authorAlex Brachet <alexbrachetmialot@gmail.com>2019-06-28 03:21:00 +0000
committerAlex Brachet <alexbrachetmialot@gmail.com>2019-06-28 03:21:00 +0000
commit3b715d67ddea3599623090212f9a0880cf164806 (patch)
treeeae1a57a9bd366d59ad7ab96f427931d1d281d19 /llvm/unittests/Support/Path.cpp
parent588a17097038d5e0e4053116306aca80f766d853 (diff)
downloadbcm5719-llvm-3b715d67ddea3599623090212f9a0880cf164806.tar.gz
bcm5719-llvm-3b715d67ddea3599623090212f9a0880cf164806.zip
[Support] Add fs::getUmask() function and change fs::setPermissions
Summary: This patch changes fs::setPermissions to optionally set permissions while respecting the umask. It also adds the function fs::getUmask() which returns the current umask. Reviewers: jhenderson, rupprecht, aprantl, lhames Reviewed By: jhenderson, rupprecht Subscribers: sanaanajjar231288, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D63583 llvm-svn: 364621
Diffstat (limited to 'llvm/unittests/Support/Path.cpp')
-rw-r--r--llvm/unittests/Support/Path.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp
index f0e11b4e3f6..9cc62a7d164 100644
--- a/llvm/unittests/Support/Path.cpp
+++ b/llvm/unittests/Support/Path.cpp
@@ -1526,6 +1526,59 @@ TEST_F(FileSystemTest, is_local) {
EXPECT_EQ(TestDirectoryIsLocal, TempFileIsLocal);
}
+TEST_F(FileSystemTest, getUmask) {
+#ifdef _WIN32
+ EXPECT_EQ(fs::getUmask(), 0U) << "Should always be 0 on Windows.";
+#else
+ unsigned OldMask = ::umask(0022);
+ unsigned CurrentMask = fs::getUmask();
+ EXPECT_EQ(CurrentMask, 0022U)
+ << "getUmask() didn't return previously set umask()";
+ EXPECT_EQ(::umask(OldMask), 0022) << "getUmask() may have changed umask()";
+#endif
+}
+
+TEST_F(FileSystemTest, RespectUmask) {
+#ifndef _WIN32
+ unsigned OldMask = ::umask(0022);
+
+ int FD;
+ SmallString<128> TempPath;
+ ASSERT_NO_ERROR(fs::createTemporaryFile("prefix", "temp", FD, TempPath));
+
+ fs::perms AllRWE = static_cast<fs::perms>(0777);
+
+ ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE /*RespectUmask=false*/));
+
+ ErrorOr<fs::perms> Perms = fs::getPermissions(TempPath);
+ ASSERT_TRUE(!!Perms);
+ EXPECT_EQ(Perms.get(), AllRWE) << "Should have ignored umask by default";
+
+ ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/false));
+
+ ErrorOr<fs::perms> Perms = fs::getPermissions(TempPath);
+ ASSERT_TRUE(!!Perms);
+ EXPECT_EQ(Perms.get(), AllRWE) << "Should have ignored umask";
+
+ ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/true));
+ Perms = fs::getPermissions(TempPath);
+ ASSERT_TRUE(!!Perms);
+ EXPECT_EQ(Perms.get(), static_cast<fs::perms>(0755))
+ << "Did not respect umask";
+
+ (void)::umask(0057);
+
+ ASSERT_NO_ERROR(fs::setPermissions(TempPath, AllRWE, /*RespectUmask=*/true));
+ Perms = fs::getPermissions(TempPath);
+ ASSERT_TRUE(!!Perms);
+ EXPECT_EQ(Perms.get(), static_cast<fs::perms>(0720))
+ << "Did not respect umask";
+
+ (void)::umask(OldMask);
+ (void)::close(FD);
+#endif
+}
+
TEST_F(FileSystemTest, set_current_path) {
SmallString<128> path;
OpenPOWER on IntegriCloud