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 // The string reported on errors changed, which makes those tests fail when run
15 // against already-released libc++'s.
16 // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx{{10.15|11.0}}
17 
18 // <filesystem>
19 
20 // uintmax_t file_size(const path& p);
21 // uintmax_t file_size(const path& p, std::error_code& ec) noexcept;
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_SAME_TYPE(decltype(file_size(p)), std::uintmax_t);
38     ASSERT_SAME_TYPE(decltype(file_size(p, ec)), std::uintmax_t);
39     ASSERT_NOT_NOEXCEPT(file_size(p));
40     ASSERT_NOEXCEPT(file_size(p, ec));
41 }
42 
file_size_empty_test()43 static void file_size_empty_test()
44 {
45     static_test_env static_env;
46     const path p = static_env.EmptyFile;
47     assert(file_size(p) == 0);
48     std::error_code ec;
49     assert(file_size(p, ec) == 0);
50 }
51 
file_size_non_empty()52 static void file_size_non_empty()
53 {
54     scoped_test_env env;
55     const path p = env.create_file("file", 42);
56     assert(file_size(p) == 42);
57     std::error_code ec;
58     assert(file_size(p, ec) == 42);
59 }
60 
symlink_test_case()61 static void symlink_test_case()
62 {
63     static_test_env static_env;
64     const path p = static_env.File;
65     const path p2 = static_env.SymlinkToFile;
66     assert(file_size(p) == file_size(p2));
67 }
68 
file_size_error_cases()69 static void file_size_error_cases()
70 {
71   static_test_env static_env;
72   struct {
73     path p;
74     std::errc expected_err;
75   } TestCases[] = {
76       {static_env.Dir, std::errc::is_a_directory},
77       {static_env.SymlinkToDir, std::errc::is_a_directory},
78       {static_env.BadSymlink, std::errc::no_such_file_or_directory},
79       {static_env.DNE, std::errc::no_such_file_or_directory},
80       {"", std::errc::no_such_file_or_directory}};
81     const std::uintmax_t expect = static_cast<std::uintmax_t>(-1);
82     for (auto& TC : TestCases) {
83       std::error_code ec = GetTestEC();
84       assert(file_size(TC.p, ec) == expect);
85       assert(ErrorIs(ec, TC.expected_err));
86 
87       ExceptionChecker Checker(TC.p, TC.expected_err, "file_size");
88       TEST_VALIDATE_EXCEPTION(filesystem_error, Checker, file_size(TC.p));
89     }
90 }
91 
main(int,char **)92 int main(int, char**) {
93     signature_test();
94     file_size_empty_test();
95     file_size_non_empty();
96     symlink_test_case();
97     file_size_error_cases();
98     return 0;
99 }
100