From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id 860B73896815 for ; Fri, 20 Aug 2021 14:16:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 860B73896815 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-53-UJlRhWh-PaKXlW3NE-WPFA-1; Fri, 20 Aug 2021 10:16:24 -0400 X-MC-Unique: UJlRhWh-PaKXlW3NE-WPFA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 23F5A1008065; Fri, 20 Aug 2021 14:16:23 +0000 (UTC) Received: from localhost (unknown [10.33.36.8]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8BF435FC23; Fri, 20 Aug 2021 14:16:22 +0000 (UTC) Date: Fri, 20 Aug 2021 15:16:21 +0100 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Skip filesystem tests that depend on permissions [PR90787] Message-ID: MIME-Version: 1.0 X-Clacks-Overhead: GNU Terry Pratchett X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="PMqnt7kAslRGfYQu" Content-Disposition: inline X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Aug 2021 14:16:37 -0000 --PMqnt7kAslRGfYQu Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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. Tested x86_64-linux. Committed to trunk. --PMqnt7kAslRGfYQu Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" commit 29b2fd371f18169141e20b90effa7205db68fb11 Author: Jonathan Wakely 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 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 #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; }; + 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 --PMqnt7kAslRGfYQu--