]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc
Use effective-target instead of -std options
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / experimental / filesystem / iterators / recursive_directory_iterator.cc
CommitLineData
818ab71a 1// Copyright (C) 2015-2016 Free Software Foundation, Inc.
429ee11a
JW
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
52066eae
JW
18// { dg-options "-lstdc++fs" }
19// { dg-do run { target c++11 } }
429ee11a
JW
20// { dg-require-filesystem-ts "" }
21
22#include <experimental/filesystem>
23#include <testsuite_hooks.h>
24#include <testsuite_fs.h>
25
26namespace fs = std::experimental::filesystem;
27
28void
29test01()
30{
31 bool test __attribute__((unused)) = false;
32 std::error_code ec;
33
34 // Test non-existent path.
35 const auto p = __gnu_test::nonexistent_path();
36 fs::recursive_directory_iterator iter(p, ec);
37 VERIFY( ec );
38 VERIFY( iter != fs::recursive_directory_iterator() );
39
40 // Test empty directory.
41 create_directory(p, fs::current_path(), ec);
42 VERIFY( !ec );
43 iter = fs::recursive_directory_iterator(p, ec);
44 VERIFY( !ec );
45 VERIFY( iter == fs::recursive_directory_iterator() );
46
47 // Test non-empty directory.
48 create_directories(p / "d1/d2");
49 VERIFY( !ec );
50 iter = fs::recursive_directory_iterator(p, ec);
51 VERIFY( !ec );
52 VERIFY( iter != fs::recursive_directory_iterator() );
53 VERIFY( iter->path() == p/"d1" );
54 ++iter;
55 VERIFY( iter->path() == p/"d1/d2" );
56 ++iter;
57 VERIFY( iter == fs::recursive_directory_iterator() );
58
59 // Test inaccessible directory.
60 permissions(p, fs::perms::none, ec);
61 VERIFY( !ec );
62 iter = fs::recursive_directory_iterator(p, ec);
63 VERIFY( ec );
64 VERIFY( iter != fs::recursive_directory_iterator() );
65
66 // Test inaccessible directory, skipping permission denied.
67 const auto opts = fs::directory_options::skip_permission_denied;
68 iter = fs::recursive_directory_iterator(p, opts, ec);
69 VERIFY( !ec );
70 VERIFY( iter == fs::recursive_directory_iterator() );
71
72 // Test inaccessible sub-directory.
73 permissions(p, fs::perms::owner_all, ec);
74 VERIFY( !ec );
75 permissions(p/"d1/d2", fs::perms::none, ec);
76 VERIFY( !ec );
77 iter = fs::recursive_directory_iterator(p, ec);
78 VERIFY( !ec );
79 VERIFY( iter != fs::recursive_directory_iterator() );
80 VERIFY( iter->path() == p/"d1" );
81 ++iter; // should recurse into d1
82 VERIFY( iter->path() == p/"d1/d2" );
83 iter.increment(ec); // should fail to recurse into p/d1/d2
84 VERIFY( ec );
85
86 // Test inaccessible sub-directory, skipping permission denied.
87 iter = fs::recursive_directory_iterator(p, opts, ec);
88 VERIFY( !ec );
89 VERIFY( iter != fs::recursive_directory_iterator() );
90 VERIFY( iter->path() == p/"d1" );
91 ++iter; // should recurse into d1
92 VERIFY( iter->path() == p/"d1/d2" );
93 iter.increment(ec); // should fail to recurse into p/d1/d2, so skip it
94 VERIFY( !ec );
95 VERIFY( iter == fs::recursive_directory_iterator() );
96
97 permissions(p/"d1/d2", fs::perms::owner_all, ec);
98 remove_all(p, ec);
99}
100
e4cce0ce
JW
101void
102test02()
103{
7972e246
JW
104 bool test __attribute__((unused)) = false;
105
d7187f9e
JW
106 std::error_code ec;
107 const auto p = __gnu_test::nonexistent_path();
108 create_directories(p / "d1/d2", ec);
109 VERIFY( !ec );
110
111 // Test post-increment (libstdc++/71005)
112 auto iter = fs::recursive_directory_iterator(p, ec);
113 VERIFY( !ec );
114 VERIFY( iter != fs::recursive_directory_iterator() );
115 const auto entry1 = *iter;
116 const auto entry2 = *iter++;
117 VERIFY( entry1 == entry2 );
118 VERIFY( entry1.path() == p/"d1" );
119 const auto entry3 = *iter;
120 const auto entry4 = *iter++;
121 VERIFY( entry3 == entry4 );
122 VERIFY( entry3.path() == p/"d1/d2" );
123 VERIFY( iter == fs::recursive_directory_iterator() );
124
125 remove_all(p, ec);
126}
127
128void
129test03()
130{
131 bool test __attribute__((unused)) = false;
132
133 std::error_code ec;
134 const auto p = __gnu_test::nonexistent_path();
135 create_directories(p / "longer_than_small_string_buffer", ec);
136 VERIFY( !ec );
137
138 // Test for no reallocation on each dereference (this is a GNU extension)
139 auto iter = fs::recursive_directory_iterator(p, ec);
140 const auto* s1 = iter->path().c_str();
141 const auto* s2 = iter->path().c_str();
142 VERIFY( s1 == s2 );
143
144 remove_all(p, ec);
145}
146
147void
148test04()
149{
150 bool test __attribute__((unused)) = false;
151
152 // libstdc++/71004
e4cce0ce 153 const fs::recursive_directory_iterator it;
7972e246 154 VERIFY( it == fs::recursive_directory_iterator() );
e4cce0ce
JW
155}
156
7f99d40a
JW
157void
158test05()
159{
160 bool test __attribute__((unused)) = false;
161
162 auto p = __gnu_test::nonexistent_path();
163 create_directory(p);
164 create_directory_symlink(p, p / "l");
165 fs::recursive_directory_iterator it(p), endit;
166 VERIFY( begin(it) == it );
167 static_assert( noexcept(begin(it)), "begin is noexcept" );
168 VERIFY( end(it) == endit );
169 static_assert( noexcept(end(it)), "end is noexcept" );
170}
171
429ee11a
JW
172int
173main()
174{
175 test01();
7972e246 176 test02();
d7187f9e
JW
177 test03();
178 test04();
7f99d40a 179 test05();
429ee11a 180}