xref: /llvm-project/libcxx/test/std/input.output/filesystems/fs.op.funcs/fs.op.is_empty/is_empty.pass.cpp (revision 4c5bc7667728d5383c41eb8a20dd5e49257904d2)
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