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
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03
10f7b43230SLouis Dionne
11f7b43230SLouis Dionne // <filesystem>
12f7b43230SLouis Dionne
13f7b43230SLouis Dionne // bool is_socket(file_status s) noexcept
14f7b43230SLouis Dionne // bool is_socket(path const& p);
15f7b43230SLouis Dionne // bool is_socket(path const& p, std::error_code& ec) noexcept;
16f7b43230SLouis Dionne
17cc89063bSNico Weber #include "filesystem_include.h"
18f7b43230SLouis Dionne #include <type_traits>
19f7b43230SLouis Dionne #include <cassert>
20f7b43230SLouis Dionne
21f7b43230SLouis Dionne #include "test_macros.h"
22cc89063bSNico Weber #include "rapid-cxx-test.h"
23cc89063bSNico Weber #include "filesystem_test_helper.h"
24f7b43230SLouis Dionne
25f7b43230SLouis Dionne using namespace fs;
26f7b43230SLouis Dionne
27f7b43230SLouis Dionne TEST_SUITE(is_socket_test_suite)
28f7b43230SLouis Dionne
TEST_CASE(signature_test)29f7b43230SLouis Dionne TEST_CASE(signature_test)
30f7b43230SLouis Dionne {
31f7b43230SLouis Dionne file_status s; ((void)s);
32f7b43230SLouis Dionne const path p; ((void)p);
33f7b43230SLouis Dionne std::error_code ec; ((void)ec);
34f7b43230SLouis Dionne ASSERT_NOEXCEPT(is_socket(s));
35f7b43230SLouis Dionne ASSERT_NOEXCEPT(is_socket(p, ec));
36f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(is_socket(p));
37f7b43230SLouis Dionne }
38f7b43230SLouis Dionne
TEST_CASE(is_socket_status_test)39f7b43230SLouis Dionne TEST_CASE(is_socket_status_test)
40f7b43230SLouis Dionne {
41f7b43230SLouis Dionne struct TestCase {
42f7b43230SLouis Dionne file_type type;
43f7b43230SLouis Dionne bool expect;
44f7b43230SLouis Dionne };
45f7b43230SLouis Dionne const TestCase testCases[] = {
46f7b43230SLouis Dionne {file_type::none, false},
47f7b43230SLouis Dionne {file_type::not_found, false},
48f7b43230SLouis Dionne {file_type::regular, false},
49f7b43230SLouis Dionne {file_type::directory, false},
50f7b43230SLouis Dionne {file_type::symlink, false},
51f7b43230SLouis Dionne {file_type::block, false},
52f7b43230SLouis Dionne {file_type::character, false},
53f7b43230SLouis Dionne {file_type::fifo, false},
54f7b43230SLouis Dionne {file_type::socket, true},
55f7b43230SLouis Dionne {file_type::unknown, false}
56f7b43230SLouis Dionne };
57f7b43230SLouis Dionne for (auto& TC : testCases) {
58f7b43230SLouis Dionne file_status s(TC.type);
59f7b43230SLouis Dionne TEST_CHECK(is_socket(s) == TC.expect);
60f7b43230SLouis Dionne }
61f7b43230SLouis Dionne }
62f7b43230SLouis Dionne
TEST_CASE(test_exist_not_found)63f7b43230SLouis Dionne TEST_CASE(test_exist_not_found)
64f7b43230SLouis Dionne {
65b62ce9e0SSergej Jaskiewicz static_test_env static_env;
66b62ce9e0SSergej Jaskiewicz const path p = static_env.DNE;
67f7b43230SLouis Dionne TEST_CHECK(is_socket(p) == false);
68f7b43230SLouis Dionne }
69f7b43230SLouis Dionne
TEST_CASE(test_is_socket_fails)70f7b43230SLouis Dionne TEST_CASE(test_is_socket_fails)
71f7b43230SLouis Dionne {
72f7b43230SLouis Dionne scoped_test_env env;
73*b166441bSMartin Storsjö #ifdef _WIN32
74*b166441bSMartin Storsjö // Windows doesn't support setting perms::none to trigger failures
75*b166441bSMartin Storsjö // reading directories; test using a special inaccessible directory
76*b166441bSMartin Storsjö // instead.
77*b166441bSMartin Storsjö const path p = GetWindowsInaccessibleDir();
78*b166441bSMartin Storsjö if (p.empty())
79*b166441bSMartin Storsjö TEST_UNSUPPORTED();
80*b166441bSMartin Storsjö #else
81f7b43230SLouis Dionne const path dir = env.create_dir("dir");
82*b166441bSMartin Storsjö const path p = env.create_file("dir/file", 42);
83f7b43230SLouis Dionne permissions(dir, perms::none);
84*b166441bSMartin Storsjö #endif
85f7b43230SLouis Dionne
86f7b43230SLouis Dionne std::error_code ec;
87*b166441bSMartin Storsjö TEST_CHECK(is_socket(p, ec) == false);
88f7b43230SLouis Dionne TEST_CHECK(ec);
89f7b43230SLouis Dionne
90*b166441bSMartin Storsjö TEST_CHECK_THROW(filesystem_error, is_socket(p));
91f7b43230SLouis Dionne }
92f7b43230SLouis Dionne
93f7b43230SLouis Dionne TEST_SUITE_END()
94