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-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // REQUIRES: can-create-symlinks
10 // UNSUPPORTED: c++03, c++11, c++14
11 // UNSUPPORTED: no-filesystem
12 // UNSUPPORTED: availability-filesystem-missing
13
14 // Starting in Android N (API 24), SELinux policy prevents the shell user from
15 // creating a FIFO file.
16 // XFAIL: LIBCXX-ANDROID-FIXME && !android-device-api={{21|22|23}}
17
18 // <filesystem>
19
20 // bool is_empty(path const& p);
21 // bool is_empty(path const& p, std::error_code& ec);
22
23 #include <filesystem>
24 #include <type_traits>
25 #include <cassert>
26
27 #include "assert_macros.h"
28 #include "test_macros.h"
29 #include "filesystem_test_helper.h"
30 namespace fs = std::filesystem;
31 using namespace fs;
32
signature_test()33 static void signature_test()
34 {
35 const path p; ((void)p);
36 std::error_code ec; ((void)ec);
37 ASSERT_NOT_NOEXCEPT(is_empty(p, ec));
38 ASSERT_NOT_NOEXCEPT(is_empty(p));
39 }
40
test_exist_not_found()41 static void test_exist_not_found()
42 {
43 static_test_env static_env;
44 const path p = static_env.DNE;
45 std::error_code ec;
46 assert(is_empty(p, ec) == false);
47 assert(ec);
48 TEST_THROWS_TYPE(filesystem_error, is_empty(p));
49 }
50
test_is_empty_directory()51 static void test_is_empty_directory()
52 {
53 static_test_env static_env;
54 assert(!is_empty(static_env.Dir));
55 assert(!is_empty(static_env.SymlinkToDir));
56 }
57
test_is_empty_directory_dynamic()58 static void test_is_empty_directory_dynamic()
59 {
60 scoped_test_env env;
61 assert(is_empty(env.test_root));
62 env.create_file("foo", 42);
63 assert(!is_empty(env.test_root));
64 }
65
test_is_empty_file()66 static void test_is_empty_file()
67 {
68 static_test_env static_env;
69 assert(is_empty(static_env.EmptyFile));
70 assert(!is_empty(static_env.NonEmptyFile));
71 }
72
test_is_empty_fails()73 static void test_is_empty_fails()
74 {
75 scoped_test_env env;
76 #ifdef _WIN32
77 // Windows doesn't support setting perms::none to trigger failures
78 // reading directories; test using a special inaccessible directory
79 // instead.
80 const path p = GetWindowsInaccessibleDir();
81 if (p.empty())
82 return;
83 #else
84 const path dir = env.create_dir("dir");
85 const path p = env.create_dir("dir/dir2");
86 permissions(dir, perms::none);
87 #endif
88
89 std::error_code ec;
90 assert(is_empty(p, ec) == false);
91 assert(ec);
92
93 TEST_THROWS_TYPE(filesystem_error, is_empty(p));
94 }
95
test_directory_access_denied()96 static void test_directory_access_denied()
97 {
98 scoped_test_env env;
99 #ifdef _WIN32
100 // Windows doesn't support setting perms::none to trigger failures
101 // reading directories; test using a special inaccessible directory
102 // instead.
103 const path dir = GetWindowsInaccessibleDir();
104 if (dir.empty())
105 return;
106 #else
107 const path dir = env.create_dir("dir");
108 const path file1 = env.create_file("dir/file", 42);
109 permissions(dir, perms::none);
110 #endif
111
112 std::error_code ec = GetTestEC();
113 assert(is_empty(dir, ec) == false);
114 assert(ec);
115 assert(ec != GetTestEC());
116
117 TEST_THROWS_TYPE(filesystem_error, is_empty(dir));
118 }
119
120
121 #ifndef _WIN32
test_fifo_fails()122 static void test_fifo_fails()
123 {
124 scoped_test_env env;
125 const path fifo = env.create_fifo("fifo");
126
127 std::error_code ec = GetTestEC();
128 assert(is_empty(fifo, ec) == false);
129 assert(ec);
130 assert(ec != GetTestEC());
131
132 TEST_THROWS_TYPE(filesystem_error, is_empty(fifo));
133 }
134 #endif // _WIN32
135
main(int,char **)136 int main(int, char**) {
137 signature_test();
138 test_exist_not_found();
139 test_is_empty_directory();
140 test_is_empty_directory_dynamic();
141 test_is_empty_file();
142 test_is_empty_fails();
143 test_directory_access_denied();
144 #ifndef _WIN32
145 test_fifo_fails();
146 #endif
147
148 return 0;
149 }
150