]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/experimental/filesystem/operations/copy.cc
1 // { dg-options "-DUSE_FILESYSTEM_TS -lstdc++fs" }
2 // { dg-do run { target c++11 } }
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]
24 #include <experimental/filesystem>
25 #include <testsuite_fs.h>
26 #include <testsuite_hooks.h>
28 namespace fs
= std::experimental::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 auto from
= __gnu_test::nonexistent_path();
71 auto to
= __gnu_test::nonexistent_path();
72 std::error_code ec
, bad
= std::make_error_code(std::errc::invalid_argument
);
75 fs::create_symlink(".", from
, ec
);
77 VERIFY( fs::exists(from
) );
80 fs::copy(from
, to
, fs::copy_options::skip_symlinks
, ec
);
82 VERIFY( !fs::exists(to
) );
85 fs::copy(from
, to
, fs::copy_options::skip_symlinks
, ec
);
87 VERIFY( !fs::exists(to
) );
91 fs::copy_options::skip_symlinks
|fs::copy_options::copy_symlinks
,
94 VERIFY( !fs::exists(to
) );
97 fs::copy(from
, to
, fs::copy_options::copy_symlinks
, ec
);
99 VERIFY( fs::exists(to
) );
100 VERIFY( is_symlink(to
) );
102 fs::copy(from
, to
, fs::copy_options::copy_symlinks
, ec
);
109 // Test is_regular_file(f) case.
113 auto from
= __gnu_test::nonexistent_path();
114 auto to
= __gnu_test::nonexistent_path();
117 std::ofstream
{from
.c_str()};
118 VERIFY( fs::exists(from
) );
119 VERIFY( fs::file_size(from
) == 0 );
121 VERIFY( fs::exists(to
) );
122 VERIFY( fs::file_size(to
) == 0 );
125 VERIFY( !fs::exists(to
) );
126 std::ofstream
{from
.c_str()} << "Hello, filesystem!";
127 VERIFY( fs::file_size(from
) != 0 );
129 VERIFY( fs::exists(to
) );
130 VERIFY( fs::file_size(to
) == fs::file_size(from
) );
136 // Test is_directory(f) case.
140 auto from
= __gnu_test::nonexistent_path();
141 auto to
= __gnu_test::nonexistent_path();
144 create_directories(from
/"a/b/c");
147 __gnu_test::scoped_file
f(to
);
152 __gnu_test::scoped_file
f1(from
/"a/f1");
153 std::ofstream
{f1
.path
.c_str()} << "file one";
154 __gnu_test::scoped_file
f2(from
/"a/b/f2");
155 std::ofstream
{f2
.path
.c_str()} << "file two";
159 VERIFY( exists(to
) && is_empty(to
) );
162 copy(from
, to
, fs::copy_options::recursive
, ec
);
164 VERIFY( exists(to
) && !is_empty(to
) );
165 VERIFY( is_regular_file(to
/"a/f1") && !is_empty(to
/"a/f1") );
166 VERIFY( file_size(from
/"a/f1") == file_size(to
/"a/f1") );
167 VERIFY( is_regular_file(to
/"a/b/f2") && !is_empty(to
/"a/b/f2") );
168 VERIFY( file_size(from
/"a/b/f2") == file_size(to
/"a/b/f2") );
169 VERIFY( is_directory(to
/"a/b/c") && is_empty(to
/"a/b/c") );
173 remove_all(from
, ec
);
181 auto to
= __gnu_test::nonexistent_path();
182 std::error_code ec
= std::make_error_code(std::errc::invalid_argument
);
184 fs::copy("/", to
, fs::copy_options::copy_symlinks
, ec
);
185 VERIFY( !ec
); // Previous value should be cleared (LWG 2683)