public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
* [committed] libstdc++: Skip filesystem tests that depend on permissions [PR90787]
@ 2021-08-20 14:16 Jonathan Wakely
  2021-08-23 13:47 ` Jonathan Wakely
  0 siblings, 1 reply; 2+ messages in thread
From: Jonathan Wakely @ 2021-08-20 14:16 UTC (permalink / raw)
  To: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1657 bytes --]

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 <jwakely@redhat.com>

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.

Tested x86_64-linux. Committed to trunk.


[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 22638 bytes --]

commit 29b2fd371f18169141e20b90effa7205db68fb11
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Aug 20 14:51:06 2021

    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 <jwakely@redhat.com>
    
    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.

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 b49b4ae2fea..b432e8833ba 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) );
+  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) );
-#endif
+    // 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 4de25c780e0..29a9f480649 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) );
+  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 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.
+    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
+    // 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 c4cb7648e91..f99a3346ed0 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 40d83eda6f3..11605748501 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 3136d9dddbe..70f3cf0eaf4 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 9a49dcaf03c..c02e8c3c575 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 53489017669..4cabdcbe7f7 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 99202808976..bb4c185dd33 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 58d58418122..1cfda583be3 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
@@ -101,10 +101,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 50e9bad638e..abc705d7696 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) );
+  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) );
-#endif
+    // 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 f200d597e81..a9a81c8c4cb 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) );
+  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 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.
+    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) );
+    // 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 9e33de6d04a..79fe970e9f3 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 7eaba7f1173..a474fa2a37f 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 c9f08eb2d12..fedbf4714b5 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 87fd2dde41d..dc067e79e80 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 d6d251ee2f6..badd8a884cc 100644
--- a/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc
+++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/temp_directory_path.cc
@@ -102,6 +102,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 1eadf7fa767..674b60b83d2 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 <fstream>
 #include <string>
 #include <cstdio>
-#include <unistd.h> // unlink, close, getpid
+#include <unistd.h> // unlink, close, getpid, geteuid
 
 #if defined(_GNU_SOURCE) || _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
 #include <stdlib.h> // mkstemp
@@ -160,5 +160,21 @@ namespace __gnu_test
     path_type path;
   };
 
+  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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [committed] libstdc++: Skip filesystem tests that depend on permissions [PR90787]
  2021-08-20 14:16 [committed] libstdc++: Skip filesystem tests that depend on permissions [PR90787] Jonathan Wakely
@ 2021-08-23 13:47 ` Jonathan Wakely
  0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Wakely @ 2021-08-23 13:47 UTC (permalink / raw)
  To: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2125 bytes --]

On 20/08/21 15:16 +0100, Jonathan Wakely wrote:
>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 <jwakely@redhat.com>
>
>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.

This causes new failures for bare metal targets where the path tests
run, even though the rest of the filesystem lib isn't supported.
That's because I forgot to make the new function inline, so it gets
compiled in every filesystem test, and so requires a definition of
geteuid even if the function isn't used.

Making the new function inline should be sufficient to fix that.

Tested powerpc64le-linux. Committed to trunk.


[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 928 bytes --]

commit bc97e736a5597ac1545b7f9069472117b6caa867
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Aug 23 13:05:25 2021

    libstdc++: Make permissions_are_testable function inline [PR90787]
    
    This function should be inline, so that's it's not emitted in tests that
    don't use it, to avoid undefined references to geteuid().
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/90787
            * testsuite/util/testsuite_fs.h (permissions_are_testable):
            Define as inline.

diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h
index 674b60b83d2..0d32a616840 100644
--- a/libstdc++-v3/testsuite/util/testsuite_fs.h
+++ b/libstdc++-v3/testsuite/util/testsuite_fs.h
@@ -160,7 +160,7 @@ namespace __gnu_test
     path_type path;
   };
 
-  bool
+  inline bool
   permissions_are_testable(bool print_msg = true)
   {
     bool testable = false;

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-08-23 13:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-20 14:16 [committed] libstdc++: Skip filesystem tests that depend on permissions [PR90787] Jonathan Wakely
2021-08-23 13:47 ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).