]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc
modula2: Tidyup remove unnecessary parameters
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / experimental / filesystem / operations / permissions.cc
1 // Copyright (C) 2016-2024 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-options "-DUSE_FILESYSTEM_TS -lstdc++fs" }
19 // { dg-do run { target c++11 } }
20 // { dg-require-filesystem-ts "" }
21 // { dg-xfail-if "permissions not supported" { *-*-mingw* } }
22
23 // 15.26 Permissions [fs.op.permissions]
24
25 #include <experimental/filesystem>
26 #include <testsuite_fs.h>
27 #include <testsuite_hooks.h>
28
29 void
30 test01()
31 {
32 using perms = std::experimental::filesystem::perms;
33
34 auto p = __gnu_test::nonexistent_path();
35
36 __gnu_test::scoped_file f(p);
37 VERIFY( exists(p) );
38 permissions(p, perms::owner_all);
39 VERIFY( status(p).permissions() == perms::owner_all );
40 permissions(p, perms::group_read | perms::add_perms);
41 VERIFY( status(p).permissions() == (perms::owner_all | perms::group_read) );
42 permissions(p, perms::group_read | perms::remove_perms);
43 VERIFY( status(p).permissions() == perms::owner_all );
44 }
45
46 void
47 test02()
48 {
49 using perms = std::experimental::filesystem::perms;
50
51 auto p = __gnu_test::nonexistent_path();
52
53 std::error_code ec;
54 permissions(p, perms::owner_all, ec);
55 VERIFY( ec );
56
57 __gnu_test::scoped_file f(p);
58 VERIFY( exists(p) );
59
60 ec = std::make_error_code(std::errc::invalid_argument);
61 permissions(p, perms::owner_all, ec);
62 VERIFY( !ec );
63 VERIFY( status(p).permissions() == perms::owner_all );
64 permissions(p, perms::group_read | perms::add_perms, ec);
65 VERIFY( !ec );
66 VERIFY( status(p).permissions() == (perms::owner_all | perms::group_read) );
67 permissions(p, perms::group_read | perms::remove_perms, ec);
68 VERIFY( !ec );
69 VERIFY( status(p).permissions() == perms::owner_all );
70 }
71
72 void
73 test03()
74 {
75 #ifndef NO_SYMLINKS
76 using perms = std::experimental::filesystem::perms;
77
78 __gnu_test::scoped_file f;
79 VERIFY( exists(f.path) );
80
81 auto p = __gnu_test::nonexistent_path();
82 create_symlink(f.path, p);
83
84 std::error_code ec, ec2;
85 permissions(p, perms::owner_all | perms::symlink_nofollow, ec);
86 try
87 {
88 permissions(p, perms::owner_all | perms::symlink_nofollow);
89 }
90 catch (const std::experimental::filesystem::filesystem_error& ex)
91 {
92 ec2 = ex.code();
93 VERIFY( ex.path1() == p );
94 }
95 // Both calls should succeed, or both should fail with same error:
96 VERIFY( ec == ec2 );
97
98 remove(p);
99 #endif
100 }
101
102 void
103 test04()
104 {
105 #ifndef NO_SYMLINKS
106 using perms = std::experimental::filesystem::perms;
107
108 auto p = __gnu_test::nonexistent_path();
109 create_symlink(__gnu_test::nonexistent_path(), p);
110
111 std::error_code ec, ec2;
112 permissions(p, perms::owner_all, ec);
113 VERIFY( ec );
114 try
115 {
116 permissions(p, perms::owner_all);
117 }
118 catch (const std::experimental::filesystem::filesystem_error& ex)
119 {
120 ec2 = ex.code();
121 VERIFY( ex.path1() == p );
122 }
123 VERIFY( ec == ec2 );
124
125 remove(p);
126 #endif
127 }
128
129 void
130 test05()
131 {
132 using perms = std::experimental::filesystem::perms;
133 std::error_code ec;
134
135 __gnu_test::scoped_file f;
136 auto p = perms::owner_write;
137
138 // symlink_nofollow should not give an error for non-symlinks
139 permissions(f.path, p|perms::symlink_nofollow, ec);
140 VERIFY( !ec );
141 auto st = status(f.path);
142 VERIFY( st.permissions() == p );
143 p |= perms::owner_read;
144 permissions(f.path, p|perms::symlink_nofollow, ec);
145 st = status(f.path);
146 VERIFY( st.permissions() == p );
147 }
148
149 int
150 main()
151 {
152 test01();
153 test02();
154 test03();
155 test04();
156 test05();
157 }