• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // UNSUPPORTED: c++98, c++03
11 
12 // <filesystem>
13 
14 // void copy_symlink(const path& existing_symlink, const path& new_symlink);
15 // void copy_symlink(const path& existing_symlink, const path& new_symlink,
16 //                   error_code& ec) noexcept;
17 
18 #include "filesystem_include.hpp"
19 #include <type_traits>
20 #include <cassert>
21 
22 #include "test_macros.h"
23 #include "rapid-cxx-test.hpp"
24 #include "filesystem_test_helper.hpp"
25 
26 using namespace fs;
27 
28 TEST_SUITE(filesystem_copy_symlink_test_suite)
29 
TEST_CASE(test_signatures)30 TEST_CASE(test_signatures)
31 {
32     const path p; ((void)p);
33     std::error_code ec; ((void)ec);
34     ASSERT_NOT_NOEXCEPT(fs::copy_symlink(p, p));
35     ASSERT_NOEXCEPT(fs::copy_symlink(p, p, ec));
36 }
37 
38 
TEST_CASE(test_error_reporting)39 TEST_CASE(test_error_reporting)
40 {
41     auto checkThrow = [](path const& f, path const& t, const std::error_code& ec)
42     {
43 #ifndef TEST_HAS_NO_EXCEPTIONS
44         try {
45             fs::copy_symlink(f, t);
46             return true;
47         } catch (filesystem_error const& err) {
48             return err.path1() == f
49                 && err.code() == ec;
50         }
51 #else
52         ((void)f); ((void)t); ((void)ec);
53         return true;
54 #endif
55     };
56 
57     scoped_test_env env;
58     const path file = env.create_file("file1", 42);
59     const path file2 = env.create_file("file2", 55);
60     const path sym = env.create_symlink(file, "sym");
61     const path dir = env.create_dir("dir");
62     const path dne = env.make_env_path("dne");
63     { // from is a file, not a symlink
64         std::error_code ec;
65         fs::copy_symlink(file, dne, ec);
66         TEST_REQUIRE(ec);
67         TEST_CHECK(checkThrow(file, dne, ec));
68     }
69     { // from is a file, not a symlink
70         std::error_code ec;
71         fs::copy_symlink(dir, dne, ec);
72         TEST_REQUIRE(ec);
73         TEST_CHECK(checkThrow(dir, dne, ec));
74     }
75     { // destination exists
76         std::error_code ec;
77         fs::copy_symlink(sym, file2, ec);
78         TEST_REQUIRE(ec);
79     }
80 }
81 
TEST_CASE(copy_symlink_basic)82 TEST_CASE(copy_symlink_basic)
83 {
84     scoped_test_env env;
85     const path dir = env.create_dir("dir");
86     const path dir_sym = env.create_symlink(dir, "dir_sym");
87     const path file = env.create_file("file", 42);
88     const path file_sym = env.create_symlink(file, "file_sym");
89     { // test for directory symlinks
90         const path dest = env.make_env_path("dest1");
91         std::error_code ec;
92         fs::copy_symlink(dir_sym, dest, ec);
93         TEST_REQUIRE(!ec);
94         TEST_CHECK(is_symlink(dest));
95         TEST_CHECK(equivalent(dest, dir));
96     }
97     { // test for file symlinks
98         const path dest = env.make_env_path("dest2");
99         std::error_code ec;
100         fs::copy_symlink(file_sym, dest, ec);
101         TEST_REQUIRE(!ec);
102         TEST_CHECK(is_symlink(dest));
103         TEST_CHECK(equivalent(dest, file));
104     }
105 }
106 
107 
108 TEST_SUITE_END()
109