[unit test] Complete FUSE unit tests #22

This commit is contained in:
2025-09-20 10:27:12 -05:00
parent e9df198cbd
commit 38e928811e

View File

@@ -53,99 +53,94 @@ TYPED_TEST(fuse_test, getattr_directory_reports_type) {
this->rmdir_and_test(dir); this->rmdir_and_test(dir);
} }
/*
TYPED_TEST(fuse_test, getattr_missing_path_sets_enoent) { TYPED_TEST(fuse_test, getattr_missing_path_sets_enoent) {
std::string missing = this->mount_location + "/ga_missing.txt"; auto src = this->create_file_path("getattr");
struct stat st_unix{}; struct stat st_unix{};
errno = 0; errno = 0;
EXPECT_EQ(-1, ::stat(missing.c_str(), &st_unix)); EXPECT_EQ(-1, ::stat(src.c_str(), &st_unix));
EXPECT_EQ(ENOENT, errno); EXPECT_EQ(ENOENT, errno);
} }
TYPED_TEST(fuse_test, fgetattr_on_open_file_reflects_size_growth) { TYPED_TEST(fuse_test, fgetattr_on_open_file_reflects_size_growth) {
std::string name{"fga_grow"}; std::string name{"fgetattr"};
std::string p = this->create_file_and_test(name); auto src = this->create_file_and_test(name);
this->overwrite_text(p, "ABC"); // 3 bytes this->overwrite_text(src, "ABC");
int fd = ::open(p.c_str(), O_RDWR); auto desc = ::open(src.c_str(), O_RDWR);
ASSERT_NE(fd, -1) << "open failed: " << std::strerror(errno); ASSERT_NE(desc, -1);
// append via fd; size should grow std::string_view more{"DEF"};
const char *more = "DEF"; ASSERT_EQ(3, ::write(desc, more.data(), more.size()));
ASSERT_EQ(3, ::write(fd, more, 3)) << std::strerror(errno);
struct stat st_unix{}; struct stat st_unix{};
errno = 0; errno = 0;
ASSERT_EQ(0, ::fstat(fd, &st_unix)) << std::strerror(errno); ASSERT_EQ(0, ::fstat(desc, &st_unix));
EXPECT_TRUE(S_ISREG(st_unix.st_mode)); EXPECT_TRUE(S_ISREG(st_unix.st_mode));
EXPECT_EQ(6, st_unix.st_size); EXPECT_EQ(6, st_unix.st_size);
::close(fd); ::close(desc);
this->unlink_file_and_test(p); this->unlink_file_and_test(src);
} }
TYPED_TEST(fuse_test, fgetattr_on_directory_fd_reports_type) { TYPED_TEST(fuse_test, fgetattr_directory_reports_type) {
std::string dname{"fga_dir"}; std::string dir_name{"dir"};
std::string d = this->create_directory_and_test(dname); auto dir = this->create_directory_and_test(dir_name);
#if defined(O_DIRECTORY) #if defined(O_DIRECTORY)
int fd = ::open(d.c_str(), O_RDONLY | O_DIRECTORY); auto desc = ::open(dir.c_str(), O_RDONLY | O_DIRECTORY);
#else #else // !defined(O_DIRECTORY)
int fd = ::open(d.c_str(), O_RDONLY); auto desc = ::open(d.c_str(), O_RDONLY);
#endif #endif // defined(O_DIRECTORY)
ASSERT_NE(fd, -1) << "open dir failed: " << std::strerror(errno); ASSERT_NE(desc, -1);
struct stat st_unix{}; struct stat st_unix{};
errno = 0; errno = 0;
ASSERT_EQ(0, ::fstat(fd, &st_unix)) << std::strerror(errno); ASSERT_EQ(0, ::fstat(desc, &st_unix));
EXPECT_TRUE(S_ISDIR(st_unix.st_mode)); EXPECT_TRUE(S_ISDIR(st_unix.st_mode));
::close(fd); ::close(desc);
this->rmdir_and_test(d); this->rmdir_and_test(dir);
} }
TYPED_TEST(fuse_test, fgetattr_on_closed_fd_sets_ebadf) { TYPED_TEST(fuse_test, fgetattr_on_closed_fd_sets_ebadf) {
std::string name{"fga_ebadf"}; std::string name{"fgetattr"};
std::string p = this->create_file_and_test(name); auto src = this->create_file_and_test(name);
this->overwrite_text(p, "X"); this->overwrite_text(src, "X");
int fd = ::open(p.c_str(), O_RDONLY); auto desc = ::open(src.c_str(), O_RDONLY);
ASSERT_NE(fd, -1); ASSERT_NE(desc, -1);
ASSERT_EQ(0, ::close(fd)); ASSERT_EQ(0, ::close(desc));
struct stat st_unix{}; struct stat st_unix{};
errno = 0; errno = 0;
EXPECT_EQ(-1, ::fstat(fd, &st_unix)); EXPECT_EQ(-1, ::fstat(desc, &st_unix));
EXPECT_EQ(EBADF, errno); EXPECT_EQ(EBADF, errno);
this->unlink_file_and_test(p); this->unlink_file_and_test(src);
} }
TYPED_TEST(fuse_test, getattr_reflects_changes_after_write_and_chmod) { TYPED_TEST(fuse_test, getattr_reflects_changes_after_write_and_chmod) {
std::string name{"ga_mutate"}; std::string name{"getattr"};
std::string p = this->create_file_and_test(name); auto src = this->create_file_and_test(name);
this->overwrite_text(p, "HI"); // 2 bytes this->overwrite_text(src, "HI"); // 2 bytes
// Write more and sync; then stat should reflect new size. auto desc = ::open(src.c_str(), O_RDWR);
int fd = ::open(p.c_str(), O_RDWR); ASSERT_NE(desc, -1);
ASSERT_NE(fd, -1); std::string_view more{"CMDC"};
const char *more = "JKLMN"; ASSERT_EQ(4, ::write(desc, more.data(), more.size()));
ASSERT_EQ(5, ::write(fd, more, 5)); ASSERT_EQ(0, ::fsync(desc));
ASSERT_EQ(0, ::fsync(fd)); ASSERT_EQ(0, ::close(desc));
ASSERT_EQ(0, ::close(fd));
// chmod shouldnt change type; size should now be 7. ASSERT_EQ(0, ::chmod(src.c_str(), 0644));
ASSERT_EQ(0, ::chmod(p.c_str(), 0644)) << std::strerror(errno);
struct stat st_unix{}; struct stat st_unix{};
errno = 0; errno = 0;
ASSERT_EQ(0, ::stat(p.c_str(), &st_unix)) << std::strerror(errno); ASSERT_EQ(0, ::stat(src.c_str(), &st_unix));
EXPECT_TRUE(S_ISREG(st_unix.st_mode)); EXPECT_TRUE(S_ISREG(st_unix.st_mode));
EXPECT_EQ(7, st_unix.st_size); // "HIJKLMN" EXPECT_EQ(7, st_unix.st_size);
this->unlink_file_and_test(p); this->unlink_file_and_test(src);
} }
*/
} // namespace repertory } // namespace repertory
#endif // !defined(_WIN32) #endif // !defined(_WIN32)