[libcxx-commits] [PATCH] D101728: [libcxx] [test] Fix filesystem permission tests for windows
Martin Storsjö via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sun May 2 13:29:06 PDT 2021
mstorsjo created this revision.
mstorsjo added a reviewer: curdeius.
mstorsjo requested review of this revision.
Herald added a project: libc++.
Herald added a reviewer: libc++.
On Windows, the permission bits are mapped down to essentially only
two possible states; readonly or readwrite. Normalize the checked
permission bitmask to match what the implementation will return.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D101728
Files:
libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.copy_file/copy_file.pass.cpp
libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.permissions/permissions.pass.cpp
libcxx/test/support/filesystem_test_helper.h
Index: libcxx/test/support/filesystem_test_helper.h
===================================================================
--- libcxx/test/support/filesystem_test_helper.h
+++ libcxx/test/support/filesystem_test_helper.h
@@ -600,6 +600,27 @@
return LHS.native() == RHS.native();
}
+inline fs::perms PermsNormalize(fs::perms P) {
+#ifdef _WIN32
+ // On Windows, fs::perms only maps down to one bit stored in the filesystem,
+ // a boolean readonly flag.
+ // Normalize permissions to the format it gets returned; all fs entries are
+ // read+exec for all users; writable ones also have the write bit set for
+ // all users.
+ P |= fs::perms::owner_read | fs::perms::group_read | fs::perms::others_read;
+ P |= fs::perms::owner_exec | fs::perms::group_exec | fs::perms::others_exec;
+ fs::perms Write =
+ fs::perms::owner_write | fs::perms::group_write | fs::perms::others_write;
+ if ((P & Write) != fs::perms::none)
+ P |= Write;
+#endif
+ return P;
+}
+
+inline bool PermsEq(fs::perms Actual, fs::perms Expected) {
+ return Actual == PermsNormalize(Expected);
+}
+
struct ExceptionChecker {
std::errc expected_err;
fs::path expected_path1;
Index: libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.permissions/permissions.pass.cpp
===================================================================
--- libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.permissions/permissions.pass.cpp
+++ libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.permissions/permissions.pass.cpp
@@ -8,8 +8,6 @@
// UNSUPPORTED: c++03
-// XFAIL: LIBCXX-WINDOWS-FIXME
-
// <filesystem>
// void permissions(const path& p, perms prms,
@@ -128,18 +126,22 @@
permissions(TC.p, TC.set_perms, TC.opts, ec);
TEST_CHECK(!ec);
auto pp = status(TC.p).permissions();
- TEST_CHECK(pp == TC.expected);
+ TEST_CHECK(PermsEq(pp, TC.expected));
}
if (TC.opts == perm_options::replace) {
std::error_code ec = GetTestEC();
permissions(TC.p, TC.set_perms, ec);
TEST_CHECK(!ec);
auto pp = status(TC.p).permissions();
- TEST_CHECK(pp == TC.expected);
+ TEST_CHECK(PermsEq(pp, TC.expected));
}
}
}
+#ifndef _WIN32
+// This test isn't currently meaningful on Windows; the Windows file
+// permissions visible via std::filesystem doesn't show any difference
+// between owner/group/others.
TEST_CASE(test_no_resolve_symlink_on_symlink)
{
scoped_test_env env;
@@ -182,5 +184,6 @@
TEST_CHECK(symlink_status(sym).permissions() == expected_link_perms);
}
}
+#endif
TEST_SUITE_END()
Index: libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.copy_file/copy_file.pass.cpp
===================================================================
--- libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.copy_file/copy_file.pass.cpp
+++ libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.copy_file/copy_file.pass.cpp
@@ -8,8 +8,6 @@
// UNSUPPORTED: c++03
-// XFAIL: LIBCXX-WINDOWS-FIXME
-
// The string reported on errors changed, which makes those tests fail when run
// against already-released libc++'s.
// XFAIL: with_system_cxx_lib=macosx10.15
@@ -114,7 +112,7 @@
TEST_REQUIRE(fs::copy_file(file, dest, ec) == true);
TEST_CHECK(!ec);
auto new_st = status(dest);
- TEST_CHECK(new_st.permissions() == new_perms);
+ TEST_CHECK(PermsEq(new_st.permissions(), new_perms));
}
TEST_CASE(copy_dir_test) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101728.342268.patch
Type: text/x-patch
Size: 3521 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210502/8af61fba/attachment-0001.bin>
More information about the libcxx-commits
mailing list