]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/27_io/filesystem/operations/create_directories.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 27_io / filesystem / operations / create_directories.cc
1 // Copyright (C) 2015-2021 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 "-std=gnu++17" }
19 // { dg-do run { target c++17 } }
20 // { dg-require-filesystem-ts "" }
21
22 #include <filesystem>
23 #include <testsuite_hooks.h>
24 #include <testsuite_fs.h>
25
26 namespace fs = std::filesystem;
27
28 void
29 test01()
30 {
31 const std::error_code bad_ec = make_error_code(std::errc::invalid_argument);
32 std::error_code ec;
33
34 // Test empty path.
35 bool b = fs::create_directories( "", ec );
36 VERIFY( ec );
37 VERIFY( !b );
38
39 // Test existing path.
40 ec = bad_ec;
41 b = fs::create_directories( fs::current_path(), ec );
42 VERIFY( !ec );
43 VERIFY( !b );
44
45 // Test non-existent path.
46 const auto p = __gnu_test::nonexistent_path();
47 ec = bad_ec;
48 b = fs::create_directories( p, ec );
49 VERIFY( !ec );
50 VERIFY( b );
51 VERIFY( is_directory(p) );
52
53 ec = bad_ec;
54 b = fs::create_directories( p/".", ec );
55 VERIFY( !ec );
56 VERIFY( !b );
57
58 ec = bad_ec;
59 b = fs::create_directories( p/"..", ec );
60 VERIFY( !ec );
61 VERIFY( !b );
62
63 ec = bad_ec;
64 b = fs::create_directories( p/"d1/d2/d3", ec );
65 VERIFY( !ec );
66 VERIFY( b );
67 VERIFY( is_directory(p/"d1/d2/d3") );
68
69 ec = bad_ec;
70 b = fs::create_directories( p/"./d4/../d5", ec );
71 VERIFY( !ec );
72 VERIFY( b );
73 #if defined(__MINGW32__) || defined(__MINGW64__)
74 // create_directories("./d4/..") is a no-op, does not create "d4"
75 #else
76 VERIFY( is_directory(p/"d4") );
77 #endif
78 VERIFY( is_directory(p/"d5") );
79 VERIFY( is_directory(p/"./d4/../d5") );
80
81 std::uintmax_t count = remove_all(p, ec);
82 #if defined(__MINGW32__) || defined(__MINGW64__)
83 VERIFY( count == 5 );
84 #else
85 VERIFY( count == 6 );
86 #endif
87 }
88
89 void
90 test02()
91 {
92 // PR libstdc++/86910
93 const auto p = __gnu_test::nonexistent_path();
94 std::error_code ec;
95 bool result;
96
97 {
98 __gnu_test::scoped_file file;
99
100 result = create_directories(file.path, ec);
101 VERIFY( !result );
102 VERIFY( ec == std::errc::not_a_directory );
103 ec.clear();
104 result = create_directories(file.path / "foo", ec);
105 VERIFY( !result );
106 VERIFY( ec == std::errc::not_a_directory );
107 ec.clear();
108 }
109
110 create_directories(p);
111 {
112 __gnu_test::scoped_file dir(p, __gnu_test::scoped_file::adopt_file);
113 __gnu_test::scoped_file file(dir.path/"file");
114
115 result = create_directories(file.path, ec);
116 VERIFY( !result );
117 VERIFY( ec == std::errc::not_a_directory );
118 ec.clear();
119 result = create_directories(file.path/"../bar", ec);
120 #if defined(__MINGW32__) || defined(__MINGW64__)
121 VERIFY( result );
122 VERIFY( !ec );
123 VERIFY( is_directory(dir.path/"bar") );
124 remove(dir.path/"bar");
125 #else
126 VERIFY( !result );
127 VERIFY( ec == std::errc::not_a_directory );
128 VERIFY( !is_directory(dir.path/"bar") );
129 #endif
130 }
131 }
132
133 void
134 test03()
135 {
136 // PR libstdc++/87846
137 const auto p = __gnu_test::nonexistent_path() / "";
138 bool result = create_directories(p);
139 VERIFY( result );
140 VERIFY( exists(p) );
141 remove(p);
142 result = create_directories(p/"foo/");
143 VERIFY( result );
144 VERIFY( exists(p) );
145 VERIFY( exists(p/"foo") );
146 remove_all(p);
147 }
148
149 int
150 main()
151 {
152 test01();
153 test02();
154 test03();
155 }