[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
Tue May 11 10:46:27 PDT 2021


This revision was automatically updated to reflect the committed changes.
Closed by commit rG68de58cd649c: [libcxx] [test] Fix filesystem permission tests for windows (authored by mstorsjo).

Changed prior to commit:
  https://reviews.llvm.org/D101728?vs=343307&id=344481#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D101728/new/

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,23 @@
   return LHS.native() == RHS.native();
 }
 
+inline fs::perms NormalizeExpectedPerms(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;
+}
+
 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(pp == NormalizeExpectedPerms(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(pp == NormalizeExpectedPerms(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: use_system_cxx_lib && x86_64-apple-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(new_st.permissions() == NormalizeExpectedPerms(new_perms));
 }
 
 TEST_CASE(copy_dir_test) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101728.344481.patch
Type: text/x-patch
Size: 3483 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210511/a6567508/attachment.bin>


More information about the libcxx-commits mailing list