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 // <experimental/filesystem>
13 
14 // bool remove(const path& p);
15 // bool remove(const path& p, error_code& ec) noexcept;
16 
17 #include <experimental/filesystem>
18 
19 #include "test_macros.h"
20 #include "rapid-cxx-test.hpp"
21 #include "filesystem_test_helper.hpp"
22 
23 using namespace std::experimental::filesystem;
24 namespace fs = std::experimental::filesystem;
25 
26 TEST_SUITE(filesystem_remove_test_suite)
27 
TEST_CASE(test_signatures)28 TEST_CASE(test_signatures)
29 {
30     const path p; ((void)p);
31     std::error_code ec; ((void)ec);
32     ASSERT_SAME_TYPE(decltype(fs::remove(p)), bool);
33     ASSERT_SAME_TYPE(decltype(fs::remove(p, ec)), bool);
34 
35     ASSERT_NOT_NOEXCEPT(fs::remove(p));
36     ASSERT_NOEXCEPT(fs::remove(p, ec));
37 }
38 
TEST_CASE(test_error_reporting)39 TEST_CASE(test_error_reporting)
40 {
41     auto checkThrow = [](path const& f, const std::error_code& ec)
42     {
43 #ifndef TEST_HAS_NO_EXCEPTIONS
44         try {
45             fs::remove(f);
46             return false;
47         } catch (filesystem_error const& err) {
48             return err.path1() == f
49                 && err.path2() == ""
50                 && err.code() == ec;
51         }
52 #else
53         ((void)f); ((void)ec);
54         return true;
55 #endif
56     };
57     scoped_test_env env;
58     const path non_empty_dir = env.create_dir("dir");
59     env.create_file(non_empty_dir / "file1", 42);
60     const path bad_perms_dir = env.create_dir("bad_dir");
61     const path file_in_bad_dir = env.create_file(bad_perms_dir / "file", 42);
62     permissions(bad_perms_dir, perms::none);
63     const path testCases[] = {
64         "",
65         env.make_env_path("dne"),
66         non_empty_dir,
67         file_in_bad_dir,
68     };
69     for (auto& p : testCases) {
70         std::error_code ec;
71         TEST_CHECK(!fs::remove(p, ec));
72         TEST_CHECK(ec);
73         TEST_CHECK(checkThrow(p, ec));
74     }
75 }
76 
TEST_CASE(basic_remove_test)77 TEST_CASE(basic_remove_test)
78 {
79     scoped_test_env env;
80     const path dne = env.make_env_path("dne");
81     const path link = env.create_symlink(dne, "link");
82     const path nested_link = env.make_env_path("nested_link");
83     create_symlink(link, nested_link);
84     const path testCases[] = {
85         env.create_file("file", 42),
86         env.create_dir("empty_dir"),
87         nested_link,
88         link
89     };
90     for (auto& p : testCases) {
91         std::error_code ec = std::make_error_code(std::errc::address_in_use);
92         TEST_CHECK(remove(p, ec));
93         TEST_CHECK(!ec);
94         TEST_CHECK(!exists(symlink_status(p)));
95     }
96 }
97 
98 TEST_SUITE_END()
99