Skip to content

Commit 5d35747

Browse files
[libc] Refactor statvfs tests (#114147)
The previous statvfs tests had several issues, this patch updates them to meet current standards.
1 parent 56dcfbe commit 5d35747

File tree

3 files changed

+80
-82
lines changed

3 files changed

+80
-82
lines changed

libc/test/src/sys/statvfs/linux/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ add_libc_unittest(
88
statvfs_test.cpp
99
DEPENDS
1010
libc.src.errno.errno
11-
libc.src.sys.statvfs.linux.statfs_utils
1211
libc.src.sys.statvfs.statvfs
12+
libc.src.sys.stat.mkdirat
13+
libc.src.sys.stat.rmdir
1314
libc.test.UnitTest.ErrnoSetterMatcher
1415
)
1516

@@ -21,8 +22,9 @@ add_libc_unittest(
2122
fstatvfs_test.cpp
2223
DEPENDS
2324
libc.src.errno.errno
24-
libc.src.sys.statvfs.linux.statfs_utils
2525
libc.src.sys.statvfs.fstatvfs
26+
libc.src.sys.stat.mkdirat
27+
libc.src.sys.stat.rmdir
2628
libc.src.fcntl.open
2729
libc.src.unistd.close
2830
libc.test.UnitTest.ErrnoSetterMatcher
Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
1+
//===-- Unittests for fstatvfs --------------------------------------------===//
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+
19
#include "hdr/fcntl_macros.h"
210
#include "src/__support/macros/config.h"
311
#include "src/fcntl/open.h"
12+
#include "src/sys/stat/mkdirat.h"
413
#include "src/sys/statvfs/fstatvfs.h"
5-
#include "src/sys/statvfs/linux/statfs_utils.h"
614
#include "src/unistd/close.h"
15+
#include "src/unistd/rmdir.h"
716
#include "test/UnitTest/ErrnoSetterMatcher.h"
8-
#include "test/UnitTest/LibcTest.h"
9-
#include <linux/magic.h>
17+
#include "test/UnitTest/Test.h"
18+
1019
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
1120

12-
#ifdef SYS_statfs64
13-
using StatFs = statfs64;
14-
#else
15-
using StatFs = statfs;
16-
#endif
17-
18-
namespace LIBC_NAMESPACE_DECL {
19-
static int fstatfs(int fd, StatFs *buf) {
20-
using namespace statfs_utils;
21-
if (cpp::optional<StatFs> result = linux_fstatfs(fd)) {
22-
*buf = *result;
23-
return 0;
24-
}
25-
return -1;
26-
}
27-
} // namespace LIBC_NAMESPACE_DECL
28-
29-
struct PathFD {
30-
int fd;
31-
explicit PathFD(const char *path)
32-
: fd(LIBC_NAMESPACE::open(path, O_CLOEXEC | O_PATH)) {}
33-
~PathFD() { LIBC_NAMESPACE::close(fd); }
34-
operator int() const { return fd; }
35-
};
36-
37-
TEST(LlvmLibcSysStatvfsTest, FstatfsBasic) {
38-
StatFs buf;
39-
ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/"), &buf), Succeeds());
40-
ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/proc"), &buf), Succeeds());
41-
ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(PROC_SUPER_MAGIC));
42-
ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/sys"), &buf), Succeeds());
43-
ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(SYSFS_MAGIC));
21+
TEST(LlvmLibcSysFStatvfsTest, FStatvfsBasic) {
22+
struct statvfs buf;
23+
24+
int fd = LIBC_NAMESPACE::open("/", O_PATH);
25+
ASSERT_ERRNO_SUCCESS();
26+
ASSERT_GT(fd, 0);
27+
28+
// The root of the file directory must always exist
29+
ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(fd, &buf), Succeeds());
30+
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
4431
}
4532

46-
TEST(LlvmLibcSysStatvfsTest, FstatvfsInvalidFD) {
33+
TEST(LlvmLibcSysFStatvfsTest, FStatvfsInvalidPath) {
4734
struct statvfs buf;
48-
ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(-1, &buf), Fails(EBADF));
35+
36+
constexpr const char *FILENAME = "testdata/statvfs.testdir";
37+
auto TEST_DIR = libc_make_test_file_path(FILENAME);
38+
39+
ASSERT_THAT(LIBC_NAMESPACE::mkdirat(AT_FDCWD, TEST_DIR, S_IRWXU),
40+
Succeeds(0));
41+
42+
int fd = LIBC_NAMESPACE::open(TEST_DIR, O_PATH);
43+
ASSERT_ERRNO_SUCCESS();
44+
ASSERT_GT(fd, 0);
45+
46+
// create the file, assert it exists, then delete it and assert it doesn't
47+
// exist anymore.
48+
49+
ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(fd, &buf), Succeeds());
50+
51+
ASSERT_THAT(LIBC_NAMESPACE::rmdir(TEST_DIR), Succeeds(0));
52+
53+
ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(fd, &buf), Fails(ENOENT));
54+
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
55+
ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(fd, &buf), Fails(ENOENT));
4956
}
Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,43 @@
1+
//===-- Unittests for statvfs ---------------------------------------------===//
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+
#include "hdr/fcntl_macros.h"
110
#include "src/__support/macros/config.h"
2-
#include "src/sys/statvfs/linux/statfs_utils.h"
11+
#include "src/sys/stat/mkdirat.h"
312
#include "src/sys/statvfs/statvfs.h"
13+
#include "src/unistd/rmdir.h"
414
#include "test/UnitTest/ErrnoSetterMatcher.h"
5-
#include "test/UnitTest/LibcTest.h"
6-
#include <linux/magic.h>
15+
#include "test/UnitTest/Test.h"
16+
717
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
818

9-
#ifdef SYS_statfs64
10-
using StatFs = statfs64;
11-
#else
12-
using StatFs = statfs;
13-
#endif
14-
15-
namespace LIBC_NAMESPACE_DECL {
16-
static int statfs(const char *path, StatFs *buf) {
17-
using namespace statfs_utils;
18-
if (cpp::optional<LinuxStatFs> result = linux_statfs(path)) {
19-
*buf = *result;
20-
return 0;
21-
}
22-
return -1;
23-
}
24-
} // namespace LIBC_NAMESPACE_DECL
25-
26-
TEST(LlvmLibcSysStatfsTest, StatfsBasic) {
27-
StatFs buf;
28-
ASSERT_THAT(LIBC_NAMESPACE::statfs("/", &buf), Succeeds());
29-
ASSERT_THAT(LIBC_NAMESPACE::statfs("/proc", &buf), Succeeds());
30-
ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(PROC_SUPER_MAGIC));
31-
ASSERT_THAT(LIBC_NAMESPACE::statfs("/sys", &buf), Succeeds());
32-
ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(SYSFS_MAGIC));
19+
TEST(LlvmLibcSysStatvfsTest, StatvfsBasic) {
20+
struct statvfs buf;
21+
// The root of the file directory must always exist
22+
ASSERT_THAT(LIBC_NAMESPACE::statvfs("/", &buf), Succeeds());
3323
}
3424

35-
TEST(LlvmLibcSysStatfsTest, StatvfsInvalidPath) {
25+
TEST(LlvmLibcSysStatvfsTest, StatvfsInvalidPath) {
3626
struct statvfs buf;
27+
3728
ASSERT_THAT(LIBC_NAMESPACE::statvfs("", &buf), Fails(ENOENT));
38-
ASSERT_THAT(LIBC_NAMESPACE::statvfs("/nonexistent", &buf), Fails(ENOENT));
39-
ASSERT_THAT(LIBC_NAMESPACE::statvfs("/dev/null/whatever", &buf),
40-
Fails(ENOTDIR));
41-
ASSERT_THAT(LIBC_NAMESPACE::statvfs(nullptr, &buf), Fails(EFAULT));
42-
}
4329

44-
TEST(LlvmLibcSysStatfsTest, StatvfsNameTooLong) {
45-
struct statvfs buf;
46-
ASSERT_THAT(LIBC_NAMESPACE::statvfs("/", &buf), Succeeds());
47-
char *name = static_cast<char *>(__builtin_alloca(buf.f_namemax + 3));
48-
name[0] = '/';
49-
name[buf.f_namemax + 2] = '\0';
50-
for (unsigned i = 1; i < buf.f_namemax + 2; ++i) {
51-
name[i] = 'a';
52-
}
53-
ASSERT_THAT(LIBC_NAMESPACE::statvfs(name, &buf), Fails(ENAMETOOLONG));
30+
// create the file, assert it exists, then delete it and assert it doesn't
31+
// exist anymore.
32+
constexpr const char *FILENAME = "testdata/statvfs.testdir";
33+
auto TEST_DIR = libc_make_test_file_path(FILENAME);
34+
35+
ASSERT_THAT(LIBC_NAMESPACE::mkdirat(AT_FDCWD, TEST_DIR, S_IRWXU),
36+
Succeeds(0));
37+
38+
ASSERT_THAT(LIBC_NAMESPACE::statvfs(TEST_DIR, &buf), Succeeds());
39+
40+
ASSERT_THAT(LIBC_NAMESPACE::rmdir(TEST_DIR), Succeeds(0));
41+
42+
ASSERT_THAT(LIBC_NAMESPACE::statvfs(TEST_DIR, &buf), Fails(ENOENT));
5443
}

0 commit comments

Comments
 (0)