]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/27_io/filesystem/operations/copy.cc
1 // { dg-options "-std=gnu++17 -lstdc++fs" }
2 // { dg-do run { target c++17 } }
3 // { dg-require-filesystem-ts "" }
5 // Copyright (C) 2014-2019 Free Software Foundation, Inc.
7 // This file is part of the GNU ISO C++ Library. This library is free
8 // software; you can redistribute it and/or modify it under the
9 // terms of the GNU General Public License as published by the
10 // Free Software Foundation; either version 3, or (at your option)
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License along
19 // with this library; see the file COPYING3. If not see
20 // <http://www.gnu.org/licenses/>.
22 // 15.3 Copy [fs.op.copy]
25 #include <testsuite_fs.h>
26 #include <testsuite_hooks.h>
28 namespace fs
= std::filesystem
;
30 // Test error conditions.
34 auto p
= __gnu_test::nonexistent_path();
37 VERIFY( !fs::exists(p
) );
38 fs::copy(p
, ".", fs::copy_options::none
, ec
);
42 fs::copy(".", ".", fs::copy_options::none
, ec
);
45 __gnu_test::scoped_file
f(p
);
46 VERIFY( fs::is_directory(".") );
47 VERIFY( fs::is_regular_file(p
) );
49 fs::copy(".", p
, fs::copy_options::none
, ec
);
52 auto to
= __gnu_test::nonexistent_path();
54 auto opts
= fs::copy_options::create_symlinks
;
55 fs::copy("/", to
, opts
, ec
);
56 VERIFY( ec
== std::make_error_code(std::errc::is_a_directory
) );
57 VERIFY( !exists(to
) );
60 opts
!= fs::copy_options::recursive
;
61 fs::copy("/", to
, opts
, ec
);
62 VERIFY( ec
== std::make_error_code(std::errc::is_a_directory
) );
63 VERIFY( !exists(to
) );
66 // Test is_symlink(f) case.
70 const std::error_code bad_ec
= make_error_code(std::errc::invalid_argument
);
71 auto from
= __gnu_test::nonexistent_path();
72 auto to
= __gnu_test::nonexistent_path();
76 fs::create_symlink(".", from
, ec
);
78 VERIFY( fs::exists(from
) );
81 fs::copy(from
, to
, fs::copy_options::skip_symlinks
, ec
);
83 VERIFY( !fs::exists(to
) );
86 fs::copy(from
, to
, fs::copy_options::skip_symlinks
, ec
);
88 VERIFY( !fs::exists(to
) );
92 fs::copy_options::skip_symlinks
|fs::copy_options::copy_symlinks
,
95 VERIFY( !fs::exists(to
) );
98 fs::copy(from
, to
, fs::copy_options::copy_symlinks
, ec
);
100 VERIFY( fs::exists(to
) );
101 VERIFY( is_symlink(to
) );
104 fs::copy(from
, to
, fs::copy_options::copy_symlinks
, ec
);
111 // Test is_regular_file(f) case.
115 auto from
= __gnu_test::nonexistent_path();
116 auto to
= __gnu_test::nonexistent_path();
120 VERIFY( fs::exists(from
) );
121 VERIFY( fs::file_size(from
) == 0 );
123 VERIFY( fs::exists(to
) );
124 VERIFY( fs::file_size(to
) == 0 );
127 VERIFY( !fs::exists(to
) );
128 std::ofstream
{from
} << "Hello, filesystem!";
129 VERIFY( fs::file_size(from
) != 0 );
131 VERIFY( fs::exists(to
) );
132 VERIFY( fs::file_size(to
) == fs::file_size(from
) );
138 // Test is_directory(f) case.
142 const std::error_code bad_ec
= make_error_code(std::errc::invalid_argument
);
143 auto from
= __gnu_test::nonexistent_path();
144 auto to
= __gnu_test::nonexistent_path();
147 create_directories(from
/"a/b/c");
150 __gnu_test::scoped_file
f(to
);
155 __gnu_test::scoped_file
f1(from
/"a/f1");
156 std::ofstream
{f1
.path
} << "file one";
157 __gnu_test::scoped_file
f2(from
/"a/b/f2");
158 std::ofstream
{f2
.path
} << "file two";
162 VERIFY( exists(to
) && is_empty(to
) );
166 copy(from
, to
, fs::copy_options::recursive
, ec
);
168 VERIFY( exists(to
) && !is_empty(to
) );
169 VERIFY( is_regular_file(to
/"a/f1") && !is_empty(to
/"a/f1") );
170 VERIFY( file_size(from
/"a/f1") == file_size(to
/"a/f1") );
171 VERIFY( is_regular_file(to
/"a/b/f2") && !is_empty(to
/"a/b/f2") );
172 VERIFY( file_size(from
/"a/b/f2") == file_size(to
/"a/b/f2") );
173 VERIFY( is_directory(to
/"a/b/c") && is_empty(to
/"a/b/c") );
177 remove_all(from
, ec
);
185 auto to
= __gnu_test::nonexistent_path();
186 std::error_code ec
= std::make_error_code(std::errc::invalid_argument
);
188 fs::copy("/", to
, fs::copy_options::copy_symlinks
, ec
);
189 VERIFY( !ec
); // Previous value should be cleared (LWG 2683)