brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 8966244 Raw
101 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: can-create-symlinks10// UNSUPPORTED: c++03, c++11, c++1411// UNSUPPORTED: no-filesystem12 13// <filesystem>14 15// void create_symlink(const path& existing_symlink, const path& new_symlink);16// void create_symlink(const path& existing_symlink, const path& new_symlink,17//                   error_code& ec) noexcept;18 19#include <filesystem>20#include <cassert>21 22#include "test_macros.h"23#include "filesystem_test_helper.h"24namespace fs = std::filesystem;25using namespace fs;26 27static void test_signatures()28{29    const path p; ((void)p);30    std::error_code ec; ((void)ec);31    ASSERT_NOT_NOEXCEPT(fs::create_symlink(p, p));32    ASSERT_NOEXCEPT(fs::create_symlink(p, p, ec));33}34 35static void test_error_reporting()36{37    scoped_test_env env;38    const path file = env.create_file("file1", 42);39    const path file2 = env.create_file("file2", 55);40    const path sym = env.create_symlink(file, "sym");41    { // destination exists42        std::error_code ec;43        fs::create_symlink(sym, file2, ec);44        assert(ec);45    }46}47 48static void create_symlink_basic()49{50    scoped_test_env env;51    const path file = env.create_file("file", 42);52    const path file_sym = env.create_symlink(file, "file_sym");53    const path dir = env.create_dir("dir");54    const path dir_sym = env.create_directory_symlink(dir, "dir_sym");55    {56        const path dest = env.make_env_path("dest1");57        std::error_code ec;58        fs::create_symlink(file_sym, dest, ec);59        assert(!ec);60        assert(is_symlink(dest));61        assert(equivalent(dest, file));62    }63    {64        const path dest = env.make_env_path("dest2");65        std::error_code ec;66        fs::create_directory_symlink(dir_sym, dest, ec);67        assert(!ec);68        assert(is_symlink(dest));69        assert(equivalent(dest, dir));70    }71}72 73static void create_symlink_dest_cleanup()74{75    scoped_test_env env;76    const path dir = env.create_dir("dir");77    const path file = env.create_file("file", 42);78    const path sym = dir / "link";79    // The target path has to be normalized to backslashes before creating80    // the link on windows, otherwise the link isn't dereferencable.81    const path sym_target = "../file";82    path sym_target_normalized = sym_target;83    sym_target_normalized.make_preferred();84    std::error_code ec;85    fs::create_symlink(sym_target, sym, ec);86    assert(!ec);87    assert(equivalent(sym, file, ec));88    const path ret = fs::read_symlink(sym, ec);89    assert(!ec);90    assert(ret.native() == sym_target_normalized.native());91}92 93int main(int, char**) {94    test_signatures();95    test_error_reporting();96    create_symlink_basic();97    create_symlink_dest_cleanup();98 99    return 0;100}101