]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/experimental/filesystem/operations/permissions.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / experimental / filesystem / operations / permissions.cc
1 // Copyright (C) 2016-2020 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 using perms = std::experimental::filesystem::perms;
76
77 __gnu_test::scoped_file f;
78 VERIFY( exists(f.path) );
79
80 auto p = __gnu_test::nonexistent_path();
81 create_symlink(f.path, p);
82
83 std::error_code ec, ec2;
84 permissions(p, perms::owner_all | perms::symlink_nofollow, ec);
85 try
86 {
87 permissions(p, perms::owner_all | perms::symlink_nofollow);
88 }
89 catch (const std::experimental::filesystem::filesystem_error& ex)
90 {
91 ec2 = ex.code();
92 VERIFY( ex.path1() == p );
93 }
94 // Both calls should succeed, or both should fail with same error:
95 VERIFY( ec == ec2 );
96
97 remove(p);
98 }
99
100 void
101 test04()
102 {
103 using perms = std::experimental::filesystem::perms;
104
105 auto p = __gnu_test::nonexistent_path();
106 create_symlink(__gnu_test::nonexistent_path(), p);
107
108 std::error_code ec, ec2;
109 permissions(p, perms::owner_all, ec);
110 VERIFY( ec );
111 try
112 {
113 permissions(p, perms::owner_all);
114 }
115 catch (const std::experimental::filesystem::filesystem_error& ex)
116 {
117 ec2 = ex.code();
118 VERIFY( ex.path1() == p );
119 }
120 VERIFY( ec == ec2 );
121
122 remove(p);
123 }
124
125 void
126 test05()
127 {
128 using perms = std::experimental::filesystem::perms;
129 std::error_code ec;
130
131 __gnu_test::scoped_file f;
132 auto p = perms::owner_write;
133
134 // symlink_nofollow should not give an error for non-symlinks
135 permissions(f.path, p|perms::symlink_nofollow, ec);
136 VERIFY( !ec );
137 auto st = status(f.path);
138 VERIFY( st.permissions() == p );
139 p |= perms::owner_read;
140 permissions(f.path, p|perms::symlink_nofollow, ec);
141 st = status(f.path);
142 VERIFY( st.permissions() == p );
143 }
144
145 int
146 main()
147 {
148 test01();
149 test02();
150 test03();
151 test04();
152 test05();
153 }