From cec047eaeb3ca40be65500d140a3a3f16db742e1 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 20 Aug 2021 14:51:06 +0100 Subject: [PATCH] libstdc++: Skip filesystem tests that depend on permissions [PR90787] Tests that depend on filesystem permissions FAIL if run on Windows or as root. Add a helper function to detect those cases, so the tests can skip those checks gracefully. Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: PR libstdc++/90787 * testsuite/27_io/filesystem/iterators/directory_iterator.cc: Use new __gnu_test::permissions_are_testable() function. * testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc: Likewise. * testsuite/27_io/filesystem/operations/exists.cc: Likewise. * testsuite/27_io/filesystem/operations/is_empty.cc: Likewise. * testsuite/27_io/filesystem/operations/remove.cc: Likewise. * testsuite/27_io/filesystem/operations/remove_all.cc: Likewise. * testsuite/27_io/filesystem/operations/status.cc: Likewise. * testsuite/27_io/filesystem/operations/symlink_status.cc: Likewise. * testsuite/27_io/filesystem/operations/temp_directory_path.cc: Likewise. * testsuite/experimental/filesystem/iterators/directory_iterator.cc: Likewise. * testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc: Likewise. * testsuite/experimental/filesystem/operations/exists.cc: Likewise. * testsuite/experimental/filesystem/operations/is_empty.cc: Likewise. * testsuite/experimental/filesystem/operations/remove.cc: Likewise. * testsuite/experimental/filesystem/operations/remove_all.cc: Likewise. * testsuite/experimental/filesystem/operations/temp_directory_path.cc: Likewise. * testsuite/util/testsuite_fs.h (__gnu_test::permissions_are_testable): New function to guess whether testing permissions will work. (cherry picked from commit 29b2fd371f18169141e20b90effa7205db68fb11) --- .../iterators/directory_iterator.cc | 36 +++---- .../iterators/recursive_directory_iterator.cc | 97 +++++++++--------- .../27_io/filesystem/operations/exists.cc | 6 +- .../27_io/filesystem/operations/is_empty.cc | 6 +- .../27_io/filesystem/operations/remove.cc | 21 ++-- .../27_io/filesystem/operations/remove_all.cc | 7 +- .../27_io/filesystem/operations/status.cc | 6 +- .../filesystem/operations/symlink_status.cc | 3 + .../operations/temp_directory_path.cc | 6 +- .../iterators/directory_iterator.cc | 32 +++--- .../iterators/recursive_directory_iterator.cc | 98 ++++++++++--------- .../filesystem/operations/exists.cc | 6 +- .../filesystem/operations/is_empty.cc | 6 +- .../filesystem/operations/remove.cc | 21 ++-- .../filesystem/operations/remove_all.cc | 7 +- .../operations/temp_directory_path.cc | 3 + libstdc++-v3/testsuite/util/testsuite_fs.h | 18 +++- 17 files changed, 197 insertions(+), 182 deletions(-) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc index b49b4ae2feaf..b432e8833bae 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/directory_iterator.cc @@ -56,24 +56,26 @@ test01() ++iter; VERIFY( iter == end(iter) ); -#if !(defined(__MINGW32__) || defined(__MINGW64__)) - // Test inaccessible directory. - ec = bad_ec; - permissions(p, fs::perms::none, ec); - VERIFY( !ec ); - iter = fs::directory_iterator(p, ec); - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible directory, skipping permission denied. - const auto opts = fs::directory_options::skip_permission_denied; - ec = bad_ec; - iter = fs::directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter == end(iter) ); -#endif + if (__gnu_test::permissions_are_testable()) + { + // Test inaccessible directory. + ec = bad_ec; + permissions(p, fs::perms::none, ec); + VERIFY( !ec ); + iter = fs::directory_iterator(p, ec); + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible directory, skipping permission denied. + const auto opts = fs::directory_options::skip_permission_denied; + ec = bad_ec; + iter = fs::directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + + permissions(p, fs::perms::owner_all, ec); + } - permissions(p, fs::perms::owner_all, ec); remove_all(p, ec); } diff --git a/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc index 4de25c780e0c..29a9f4806491 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/iterators/recursive_directory_iterator.cc @@ -59,54 +59,55 @@ test01() ++iter; VERIFY( iter == end(iter) ); -#if ! (defined (__MINGW32__) || defined(__MINGW64__)) - // Test inaccessible directory. - ec = bad_ec; - permissions(p, fs::perms::none, ec); - VERIFY( !ec ); - iter = fs::recursive_directory_iterator(p, ec); - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible directory, skipping permission denied. - const auto opts = fs::directory_options::skip_permission_denied; - iter = fs::recursive_directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible sub-directory. - ec = bad_ec; - permissions(p, fs::perms::owner_all, ec); - VERIFY( !ec ); - ec = bad_ec; - permissions(p/"d1/d2", fs::perms::none, ec); - VERIFY( !ec ); - ec = bad_ec; - iter = fs::recursive_directory_iterator(p, ec); - VERIFY( !ec ); - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1" ); - ++iter; // should recurse into d1 - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1/d2" ); - iter.increment(ec); // should fail to recurse into p/d1/d2 - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible sub-directory, skipping permission denied. - ec = bad_ec; - iter = fs::recursive_directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1" ); - ++iter; // should recurse into d1 - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1/d2" ); - ec = bad_ec; - iter.increment(ec); // should fail to recurse into p/d1/d2, so skip it - VERIFY( !ec ); - VERIFY( iter == end(iter) ); -#endif + if (__gnu_test::permissions_are_testable()) + { + // Test inaccessible directory. + ec = bad_ec; + permissions(p, fs::perms::none, ec); + VERIFY( !ec ); + iter = fs::recursive_directory_iterator(p, ec); + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible directory, skipping permission denied. + const auto opts = fs::directory_options::skip_permission_denied; + iter = fs::recursive_directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible sub-directory. + ec = bad_ec; + permissions(p, fs::perms::owner_all, ec); + VERIFY( !ec ); + ec = bad_ec; + permissions(p/"d1/d2", fs::perms::none, ec); + VERIFY( !ec ); + ec = bad_ec; + iter = fs::recursive_directory_iterator(p, ec); + VERIFY( !ec ); + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1" ); + ++iter; // should recurse into d1 + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1/d2" ); + iter.increment(ec); // should fail to recurse into p/d1/d2 + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible sub-directory, skipping permission denied. + ec = bad_ec; + iter = fs::recursive_directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1" ); + ++iter; // should recurse into d1 + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1/d2" ); + ec = bad_ec; + iter.increment(ec); // should fail to recurse into p/d1/d2, so skip it + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + } permissions(p/"d1/d2", fs::perms::owner_all, ec); remove_all(p, ec); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc index c4cb7648e917..f99a3346ed04 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/exists.cc @@ -79,10 +79,8 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // filesystem permissions not supported - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; using std::filesystem::perms; using std::filesystem::perm_options; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc index 40d83eda6f3d..116057485010 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/is_empty.cc @@ -27,10 +27,8 @@ namespace fs = std::filesystem; void test01() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // filesystem permissions not supported - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; auto p = __gnu_test::nonexistent_path(); create_directory(p); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc index 3136d9dddbe3..70f3cf0eaf46 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove.cc @@ -76,19 +76,18 @@ test01() VERIFY( !n ); VERIFY( exists(dir/"a/b") ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No permissions support -#else - permissions(dir, fs::perms::none, ec); - if (!ec) + if (__gnu_test::permissions_are_testable()) { - ec.clear(); - n = remove(dir/"a/b", ec); - VERIFY( ec ); - VERIFY( !n ); - permissions(dir, fs::perms::owner_all, ec); + permissions(dir, fs::perms::none, ec); + if (!ec) + { + ec.clear(); + n = remove(dir/"a/b", ec); + VERIFY( ec ); + VERIFY( !n ); + permissions(dir, fs::perms::owner_all, ec); + } } -#endif ec = bad_ec; n = remove(dir/"a/b", ec); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc index 9a49dcaf03c5..c02e8c3c5756 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/remove_all.cc @@ -142,9 +142,9 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no permissions -#else + if (!__gnu_test::permissions_are_testable()) + return; + // PR libstdc++/93201 std::error_code ec; std::uintmax_t n; @@ -172,7 +172,6 @@ test04() fs::permissions(dir, fs::perms::owner_write, fs::perm_options::add); fs::remove_all(dir, ec); f.path.clear(); -#endif } int diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc index 53489017669c..4cabdcbe7f7d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/status.cc @@ -55,10 +55,8 @@ test02() void test03() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No permissions support - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; fs::path dir = __gnu_test::nonexistent_path(); fs::create_directory(dir); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc index 992028089761..bb4c185dd33f 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/symlink_status.cc @@ -68,6 +68,9 @@ test02() void test03() { + if (!__gnu_test::permissions_are_testable()) + return; + fs::path dir = __gnu_test::nonexistent_path(); fs::create_directory(dir); __gnu_test::scoped_file d(dir, __gnu_test::scoped_file::adopt_file); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc index ff84a0a45311..b55cd6c60b61 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/temp_directory_path.cc @@ -94,10 +94,8 @@ test02() void test03() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // No permissions support - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; clean_env(); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc index 50e9bad638e9..abc705d7696d 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc @@ -53,22 +53,24 @@ test01() ++iter; VERIFY( iter == end(iter) ); -#if !(defined(__MINGW32__) || defined(__MINGW64__)) - // Test inaccessible directory. - permissions(p, fs::perms::none, ec); - VERIFY( !ec ); - iter = fs::directory_iterator(p, ec); - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible directory, skipping permission denied. - const auto opts = fs::directory_options::skip_permission_denied; - iter = fs::directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter == end(iter) ); -#endif + if (__gnu_test::permissions_are_testable()) + { + // Test inaccessible directory. + permissions(p, fs::perms::none, ec); + VERIFY( !ec ); + iter = fs::directory_iterator(p, ec); + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible directory, skipping permission denied. + const auto opts = fs::directory_options::skip_permission_denied; + iter = fs::directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + + permissions(p, fs::perms::owner_all, ec); + } - permissions(p, fs::perms::owner_all, ec); remove_all(p, ec); } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc index f200d597e81c..a9a81c8c4cbc 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc @@ -61,54 +61,58 @@ test01() ++iter; VERIFY( iter == end(iter) ); - // Test inaccessible directory. - ec = bad_ec; - permissions(p, fs::perms::none, ec); - VERIFY( !ec ); - iter = fs::recursive_directory_iterator(p, ec); - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible directory, skipping permission denied. - const auto opts = fs::directory_options::skip_permission_denied; - ec = bad_ec; - iter = fs::recursive_directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible sub-directory. - ec = bad_ec; - permissions(p, fs::perms::owner_all, ec); - VERIFY( !ec ); - ec = bad_ec; - permissions(p/"d1/d2", fs::perms::none, ec); - VERIFY( !ec ); - ec = bad_ec; - iter = fs::recursive_directory_iterator(p, ec); - VERIFY( !ec ); - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1" ); - ++iter; // should recurse into d1 - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1/d2" ); - iter.increment(ec); // should fail to recurse into p/d1/d2 - VERIFY( ec ); - VERIFY( iter == end(iter) ); - - // Test inaccessible sub-directory, skipping permission denied. - ec = bad_ec; - iter = fs::recursive_directory_iterator(p, opts, ec); - VERIFY( !ec ); - VERIFY( iter != end(iter) ); - VERIFY( iter->path() == p/"d1" ); - ++iter; // should recurse into d1 - VERIFY( iter->path() == p/"d1/d2" ); - ec = bad_ec; - iter.increment(ec); // should fail to recurse into p/d1/d2, so skip it - VERIFY( !ec ); - VERIFY( iter == end(iter) ); + if (__gnu_test::permissions_are_testable()) + { + // Test inaccessible directory. + ec = bad_ec; + permissions(p, fs::perms::none, ec); + VERIFY( !ec ); + iter = fs::recursive_directory_iterator(p, ec); + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible directory, skipping permission denied. + const auto opts = fs::directory_options::skip_permission_denied; + ec = bad_ec; + iter = fs::recursive_directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible sub-directory. + ec = bad_ec; + permissions(p, fs::perms::owner_all, ec); + VERIFY( !ec ); + ec = bad_ec; + permissions(p/"d1/d2", fs::perms::none, ec); + VERIFY( !ec ); + ec = bad_ec; + iter = fs::recursive_directory_iterator(p, ec); + VERIFY( !ec ); + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1" ); + ++iter; // should recurse into d1 + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1/d2" ); + iter.increment(ec); // should fail to recurse into p/d1/d2 + VERIFY( ec ); + VERIFY( iter == end(iter) ); + + // Test inaccessible sub-directory, skipping permission denied. + ec = bad_ec; + iter = fs::recursive_directory_iterator(p, opts, ec); + VERIFY( !ec ); + VERIFY( iter != end(iter) ); + VERIFY( iter->path() == p/"d1" ); + ++iter; // should recurse into d1 + VERIFY( iter->path() == p/"d1/d2" ); + ec = bad_ec; + iter.increment(ec); // should fail to recurse into p/d1/d2, so skip it + VERIFY( !ec ); + VERIFY( iter == end(iter) ); + + permissions(p/"d1/d2", fs::perms::owner_all, ec); + } - permissions(p/"d1/d2", fs::perms::owner_all, ec); remove_all(p, ec); } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/exists.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/exists.cc index 9e33de6d04ae..79fe970e9f30 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/exists.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/exists.cc @@ -74,10 +74,8 @@ test03() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // filesystem permissions not supported - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; using perms = std::experimental::filesystem::perms; path p = __gnu_test::nonexistent_path(); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/is_empty.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/is_empty.cc index 7eaba7f11733..a474fa2a37f0 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/is_empty.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/is_empty.cc @@ -28,10 +28,8 @@ namespace fs = std::experimental::filesystem; void test01() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // filesystem permissions not supported - return; -#endif + if (!__gnu_test::permissions_are_testable()) + return; auto p = __gnu_test::nonexistent_path(); create_directory(p); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc index c9f08eb2d128..fedbf4714b5a 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove.cc @@ -78,19 +78,18 @@ test01() VERIFY( !n ); VERIFY( exists(dir/"a/b") ); -#if defined(__MINGW32__) || defined(__MINGW64__) - // No permissions support -#else - permissions(dir, fs::perms::none, ec); - if (!ec) + if (__gnu_test::permissions_are_testable()) { - ec.clear(); - n = remove(dir/"a/b", ec); - VERIFY( ec ); - VERIFY( !n ); - permissions(dir, fs::perms::owner_all, ec); + permissions(dir, fs::perms::none, ec); + if (!ec) + { + ec.clear(); + n = remove(dir/"a/b", ec); + VERIFY( ec ); + VERIFY( !n ); + permissions(dir, fs::perms::owner_all, ec); + } } -#endif ec = bad_ec; n = remove(dir/"a/b", ec); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc index 87fd2dde41d1..dc067e79e80c 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/remove_all.cc @@ -111,9 +111,9 @@ test02() void test04() { -#if defined(__MINGW32__) || defined(__MINGW64__) - // no permissions -#else + if (!__gnu_test::permissions_are_testable()) + return; + // PR libstdc++/93201 std::error_code ec; std::uintmax_t n; @@ -139,7 +139,6 @@ test04() fs::permissions(dir, fs::perms::owner_write|fs::perms::add_perms); fs::remove_all(dir, ec); f.path.clear(); -#endif } int diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc index 3e0833f597b5..03e777b00415 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc @@ -95,6 +95,9 @@ test02() void test03() { + if (!__gnu_test::permissions_are_testable()) + return; + auto p = __gnu_test::nonexistent_path(); create_directories(p/"tmp"); permissions(p, fs::perms::none); diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h index 1eadf7fa7677..0d32a616840e 100644 --- a/libstdc++-v3/testsuite/util/testsuite_fs.h +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h @@ -34,7 +34,7 @@ namespace test_fs = std::experimental::filesystem; #include #include #include -#include // unlink, close, getpid +#include // unlink, close, getpid, geteuid #if defined(_GNU_SOURCE) || _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L #include // mkstemp @@ -160,5 +160,21 @@ namespace __gnu_test path_type path; }; + inline bool + permissions_are_testable(bool print_msg = true) + { + bool testable = false; +#if !(defined __MINGW32__ || defined __MINGW64__) + if (geteuid() != 0) + testable = true; + // XXX on Linux the CAP_DAC_OVERRIDE and CAP_DAC_READ_SEARCH capabilities + // can give normal users extra permissions for files and directories. + // We ignore that possibility here. +#endif + if (print_msg && !testable) + std::puts("Skipping tests that depend on filesystem permissions"); + return testable; + } + } // namespace __gnu_test #endif -- 2.47.2