1f7b43230SLouis Dionne //===----------------------------------------------------------------------===//
2f7b43230SLouis Dionne //
3f7b43230SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f7b43230SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5f7b43230SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f7b43230SLouis Dionne //
7f7b43230SLouis Dionne //===----------------------------------------------------------------------===//
8f7b43230SLouis Dionne
9*4c5bc766SRodrigo Salazar // REQUIRES: can-create-symlinks
10ac8c9f1eSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
11c352fa74SLouis Dionne // UNSUPPORTED: no-filesystem
12c352fa74SLouis Dionne // UNSUPPORTED: availability-filesystem-missing
13f7b43230SLouis Dionne
14bce3b505SRyan Prichard // Starting in Android N (API 24), SELinux policy prevents the shell user from
15bce3b505SRyan Prichard // creating a FIFO file.
16bce3b505SRyan Prichard // XFAIL: LIBCXX-ANDROID-FIXME && !android-device-api={{21|22|23}}
17bce3b505SRyan Prichard
18f7b43230SLouis Dionne // <filesystem>
19f7b43230SLouis Dionne
20f7b43230SLouis Dionne // bool is_empty(path const& p);
21f7b43230SLouis Dionne // bool is_empty(path const& p, std::error_code& ec);
22f7b43230SLouis Dionne
23ac8c9f1eSLouis Dionne #include <filesystem>
24f7b43230SLouis Dionne #include <type_traits>
25f7b43230SLouis Dionne #include <cassert>
26f7b43230SLouis Dionne
272f2ed477SMark de Wever #include "assert_macros.h"
28f7b43230SLouis Dionne #include "test_macros.h"
29cc89063bSNico Weber #include "filesystem_test_helper.h"
30ac8c9f1eSLouis Dionne namespace fs = std::filesystem;
31f7b43230SLouis Dionne using namespace fs;
32f7b43230SLouis Dionne
signature_test()332f2ed477SMark de Wever static void signature_test()
34f7b43230SLouis Dionne {
35f7b43230SLouis Dionne const path p; ((void)p);
36f7b43230SLouis Dionne std::error_code ec; ((void)ec);
37f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(is_empty(p, ec));
38f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(is_empty(p));
39f7b43230SLouis Dionne }
40f7b43230SLouis Dionne
test_exist_not_found()412f2ed477SMark de Wever static void test_exist_not_found()
42f7b43230SLouis Dionne {
43b62ce9e0SSergej Jaskiewicz static_test_env static_env;
44b62ce9e0SSergej Jaskiewicz const path p = static_env.DNE;
45f7b43230SLouis Dionne std::error_code ec;
462f2ed477SMark de Wever assert(is_empty(p, ec) == false);
472f2ed477SMark de Wever assert(ec);
482f2ed477SMark de Wever TEST_THROWS_TYPE(filesystem_error, is_empty(p));
49f7b43230SLouis Dionne }
50f7b43230SLouis Dionne
test_is_empty_directory()512f2ed477SMark de Wever static void test_is_empty_directory()
52f7b43230SLouis Dionne {
53b62ce9e0SSergej Jaskiewicz static_test_env static_env;
542f2ed477SMark de Wever assert(!is_empty(static_env.Dir));
552f2ed477SMark de Wever assert(!is_empty(static_env.SymlinkToDir));
56f7b43230SLouis Dionne }
57f7b43230SLouis Dionne
test_is_empty_directory_dynamic()582f2ed477SMark de Wever static void test_is_empty_directory_dynamic()
59f7b43230SLouis Dionne {
60f7b43230SLouis Dionne scoped_test_env env;
612f2ed477SMark de Wever assert(is_empty(env.test_root));
62f7b43230SLouis Dionne env.create_file("foo", 42);
632f2ed477SMark de Wever assert(!is_empty(env.test_root));
64f7b43230SLouis Dionne }
65f7b43230SLouis Dionne
test_is_empty_file()662f2ed477SMark de Wever static void test_is_empty_file()
67f7b43230SLouis Dionne {
68b62ce9e0SSergej Jaskiewicz static_test_env static_env;
692f2ed477SMark de Wever assert(is_empty(static_env.EmptyFile));
702f2ed477SMark de Wever assert(!is_empty(static_env.NonEmptyFile));
71f7b43230SLouis Dionne }
72f7b43230SLouis Dionne
test_is_empty_fails()732f2ed477SMark de Wever static void test_is_empty_fails()
74f7b43230SLouis Dionne {
75f7b43230SLouis Dionne scoped_test_env env;
76b166441bSMartin Storsjö #ifdef _WIN32
77b166441bSMartin Storsjö // Windows doesn't support setting perms::none to trigger failures
78b166441bSMartin Storsjö // reading directories; test using a special inaccessible directory
79b166441bSMartin Storsjö // instead.
80b166441bSMartin Storsjö const path p = GetWindowsInaccessibleDir();
81b166441bSMartin Storsjö if (p.empty())
822f2ed477SMark de Wever return;
83b166441bSMartin Storsjö #else
84f7b43230SLouis Dionne const path dir = env.create_dir("dir");
85b166441bSMartin Storsjö const path p = env.create_dir("dir/dir2");
86f7b43230SLouis Dionne permissions(dir, perms::none);
87b166441bSMartin Storsjö #endif
88f7b43230SLouis Dionne
89f7b43230SLouis Dionne std::error_code ec;
902f2ed477SMark de Wever assert(is_empty(p, ec) == false);
912f2ed477SMark de Wever assert(ec);
92f7b43230SLouis Dionne
932f2ed477SMark de Wever TEST_THROWS_TYPE(filesystem_error, is_empty(p));
94f7b43230SLouis Dionne }
95f7b43230SLouis Dionne
test_directory_access_denied()962f2ed477SMark de Wever static void test_directory_access_denied()
97f7b43230SLouis Dionne {
98f7b43230SLouis Dionne scoped_test_env env;
99b166441bSMartin Storsjö #ifdef _WIN32
100b166441bSMartin Storsjö // Windows doesn't support setting perms::none to trigger failures
101b166441bSMartin Storsjö // reading directories; test using a special inaccessible directory
102b166441bSMartin Storsjö // instead.
103b166441bSMartin Storsjö const path dir = GetWindowsInaccessibleDir();
104b166441bSMartin Storsjö if (dir.empty())
1052f2ed477SMark de Wever return;
106b166441bSMartin Storsjö #else
107f7b43230SLouis Dionne const path dir = env.create_dir("dir");
108f7b43230SLouis Dionne const path file1 = env.create_file("dir/file", 42);
109f7b43230SLouis Dionne permissions(dir, perms::none);
110b166441bSMartin Storsjö #endif
111f7b43230SLouis Dionne
112f7b43230SLouis Dionne std::error_code ec = GetTestEC();
1132f2ed477SMark de Wever assert(is_empty(dir, ec) == false);
1142f2ed477SMark de Wever assert(ec);
1152f2ed477SMark de Wever assert(ec != GetTestEC());
116f7b43230SLouis Dionne
1172f2ed477SMark de Wever TEST_THROWS_TYPE(filesystem_error, is_empty(dir));
118f7b43230SLouis Dionne }
119f7b43230SLouis Dionne
120f7b43230SLouis Dionne
1213be7968cSMartin Storsjö #ifndef _WIN32
test_fifo_fails()1222f2ed477SMark de Wever static void test_fifo_fails()
123f7b43230SLouis Dionne {
124f7b43230SLouis Dionne scoped_test_env env;
125f7b43230SLouis Dionne const path fifo = env.create_fifo("fifo");
126f7b43230SLouis Dionne
127f7b43230SLouis Dionne std::error_code ec = GetTestEC();
1282f2ed477SMark de Wever assert(is_empty(fifo, ec) == false);
1292f2ed477SMark de Wever assert(ec);
1302f2ed477SMark de Wever assert(ec != GetTestEC());
131f7b43230SLouis Dionne
1322f2ed477SMark de Wever TEST_THROWS_TYPE(filesystem_error, is_empty(fifo));
133f7b43230SLouis Dionne }
1342f2ed477SMark de Wever #endif // _WIN32
1352f2ed477SMark de Wever
main(int,char **)1362f2ed477SMark de Wever int main(int, char**) {
1372f2ed477SMark de Wever signature_test();
1382f2ed477SMark de Wever test_exist_not_found();
1392f2ed477SMark de Wever test_is_empty_directory();
1402f2ed477SMark de Wever test_is_empty_directory_dynamic();
1412f2ed477SMark de Wever test_is_empty_file();
1422f2ed477SMark de Wever test_is_empty_fails();
1432f2ed477SMark de Wever test_directory_access_denied();
1442f2ed477SMark de Wever #ifndef _WIN32
1452f2ed477SMark de Wever test_fifo_fails();
1463be7968cSMartin Storsjö #endif
147f7b43230SLouis Dionne
1482f2ed477SMark de Wever return 0;
1492f2ed477SMark de Wever }
150