From 9d2df1a6ca2d21a1656301d1d75a5b8316dfb91d Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Thu, 3 Feb 2022 10:05:03 -0800 Subject: [PATCH 1/2] Enable fuse tests --- test/fuse/BUILD | 148 ++++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 75 deletions(-) diff --git a/test/fuse/BUILD b/test/fuse/BUILD index 158867181..3a250a53c 100644 --- a/test/fuse/BUILD +++ b/test/fuse/BUILD @@ -2,81 +2,79 @@ load("//test/runner:defs.bzl", "syscall_test") package(licenses = ["notice"]) -# FIXME(b/190750110) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:stat_test", -# ) -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:statfs_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:open_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:release_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:mknod_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:symlink_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:readlink_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:mkdir_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:read_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:write_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:rmdir_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:readdir_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:create_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:unlink_test", -# ) -# -# syscall_test( -# fuse = "True", -# test = "//test/fuse/linux:setstat_test", -# ) +syscall_test( + fuse = "True", + test = "//test/fuse/linux:stat_test", +) +syscall_test( + fuse = "True", + test = "//test/fuse/linux:statfs_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:open_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:release_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:mknod_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:symlink_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:readlink_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:mkdir_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:read_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:write_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:rmdir_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:readdir_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:create_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:unlink_test", +) + +syscall_test( + fuse = "True", + test = "//test/fuse/linux:setstat_test", +) syscall_test( fuse = "True", From 8b456152dab70f822cb6658ca056e787e4c4e906 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Wed, 2 Feb 2022 20:23:36 -0800 Subject: [PATCH 2/2] Run a new fuse server in a new thread --- test/fuse/BUILD | 5 ---- test/fuse/linux/BUILD | 2 ++ test/fuse/linux/create_test.cc | 15 ------------ test/fuse/linux/fuse_base.cc | 44 ++++++++++++++++++---------------- test/fuse/linux/fuse_base.h | 3 +++ 5 files changed, 29 insertions(+), 40 deletions(-) diff --git a/test/fuse/BUILD b/test/fuse/BUILD index 3a250a53c..714626561 100644 --- a/test/fuse/BUILD +++ b/test/fuse/BUILD @@ -75,8 +75,3 @@ syscall_test( fuse = "True", test = "//test/fuse/linux:setstat_test", ) - -syscall_test( - fuse = "True", - test = "//test/fuse/linux:mount_test", -) diff --git a/test/fuse/linux/BUILD b/test/fuse/linux/BUILD index 4e6701025..e355d923f 100644 --- a/test/fuse/linux/BUILD +++ b/test/fuse/linux/BUILD @@ -170,6 +170,8 @@ cc_library( "//test/util:posix_error", "//test/util:temp_path", "//test/util:test_util", + "//test/util:thread_util", + "@com_google_absl//absl/memory", "@com_google_absl//absl/strings:str_format", ], ) diff --git a/test/fuse/linux/create_test.cc b/test/fuse/linux/create_test.cc index 9a0219a58..0d70197bf 100644 --- a/test/fuse/linux/create_test.cc +++ b/test/fuse/linux/create_test.cc @@ -66,13 +66,6 @@ TEST_F(CreateTest, CreateFile) { iov_out = FuseGenerateIovecs(out_header, entry_payload, out_payload); SetServerResponse(FUSE_CREATE, iov_out); - // kernfs generates a successive FUSE_OPEN after the file is created. Linux's - // fuse kernel module will not send this FUSE_OPEN after creat(2). - out_header.len = - sizeof(struct fuse_out_header) + sizeof(struct fuse_open_out); - iov_out = FuseGenerateIovecs(out_header, out_payload); - SetServerResponse(FUSE_OPEN, iov_out); - int fd; TempUmask mask(new_mask); EXPECT_THAT(fd = creat(test_file_path.c_str(), mode), SyscallSucceeds()); @@ -97,14 +90,6 @@ TEST_F(CreateTest, CreateFile) { EXPECT_EQ(in_payload.umask, new_mask); EXPECT_EQ(std::string(name.data()), test_file_name_); - // Get the successive FUSE_OPEN. - struct fuse_open_in in_payload_open; - iov_in = FuseGenerateIovecs(in_header, in_payload_open); - GetServerActualRequest(iov_in); - EXPECT_EQ(in_header.len, sizeof(in_header) + sizeof(in_payload_open)); - EXPECT_EQ(in_header.opcode, FUSE_OPEN); - EXPECT_EQ(in_payload_open.flags, open_flags & O_ACCMODE); - EXPECT_THAT(close(fd), SyscallSucceeds()); // Skip the FUSE_RELEASE. SkipServerActualRequest(); diff --git a/test/fuse/linux/fuse_base.cc b/test/fuse/linux/fuse_base.cc index 5b45804e1..fc9a998b6 100644 --- a/test/fuse/linux/fuse_base.cc +++ b/test/fuse/linux/fuse_base.cc @@ -24,12 +24,13 @@ #include #include -#include "gtest/gtest.h" #include "absl/strings/str_format.h" +#include "gtest/gtest.h" #include "test/util/fuse_util.h" #include "test/util/posix_error.h" #include "test/util/temp_path.h" #include "test/util/test_util.h" +#include "test/util/thread_util.h" namespace gvisor { namespace testing { @@ -160,6 +161,8 @@ void FuseTest::MountFuse(const char* mountOpts) { void FuseTest::UnmountFuse() { EXPECT_THAT(umount(mount_point_.path().c_str()), SyscallSucceeds()); + shutdown(sock_[0], SHUT_RDWR); + fuse_server_->Join(); // TODO(gvisor.dev/issue/3330): ensure the process is terminated successfully. } @@ -232,6 +235,9 @@ void FuseTest::ServerFuseLoop() { ASSERT_EQ(fds[fd_idx].revents, POLL_IN); if (fds[fd_idx].fd == sock_[1]) { ServerHandleCommand(); + if (sock_[1] == -1) { + return; + } } else if (fds[fd_idx].fd == dev_fd_) { ServerProcessFuseRequest(); } @@ -246,23 +252,13 @@ void FuseTest::ServerFuseLoop() { void FuseTest::SetUpFuseServer(const struct fuse_init_out* payload) { ASSERT_THAT(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_), SyscallSucceeds()); - switch (fork()) { - case -1: - GTEST_FAIL(); - return; - case 0: - break; - default: - ASSERT_THAT(close(sock_[1]), SyscallSucceeds()); - WaitServerComplete(); - return; - } - - // Begin child thread, i.e. the FUSE server. - ASSERT_THAT(close(sock_[0]), SyscallSucceeds()); - ServerCompleteWith(ServerConsumeFuseInit(payload).ok()); - ServerFuseLoop(); - _exit(0); + fuse_server_ = absl::make_unique([this, payload]() { + // Begin child thread, i.e. the FUSE server. + ServerCompleteWith(ServerConsumeFuseInit(payload).ok()); + ServerFuseLoop(); + shutdown(sock_[1], SHUT_RDWR); + }); + WaitServerComplete(); } void FuseTest::ServerSendData(uint32_t data) { @@ -275,8 +271,16 @@ void FuseTest::ServerSendData(uint32_t data) { // is required after the switch keyword. void FuseTest::ServerHandleCommand() { uint32_t cmd; - EXPECT_THAT(RetryEINTR(read)(sock_[1], &cmd, sizeof(cmd)), - SyscallSucceedsWithValue(sizeof(cmd))); + int ret; + + EXPECT_THAT(ret = RetryEINTR(read)(sock_[1], &cmd, sizeof(cmd)), + SyscallSucceeds()); + if (ret == 0) { + shutdown(sock_[1], SHUT_RDWR); + sock_[1] = -1; + return; + } + EXPECT_EQ(ret, sizeof(cmd)); switch (static_cast(cmd)) { case FuseTestCmd::kSetResponse: diff --git a/test/fuse/linux/fuse_base.h b/test/fuse/linux/fuse_base.h index 6ad296ca2..bfed7cb09 100644 --- a/test/fuse/linux/fuse_base.h +++ b/test/fuse/linux/fuse_base.h @@ -25,6 +25,8 @@ #include #include "gtest/gtest.h" +#include "absl/memory/memory.h" +#include "test/util/thread_util.h" #include "test/util/posix_error.h" #include "test/util/temp_path.h" @@ -236,6 +238,7 @@ class FuseTest : public ::testing::Test { int dev_fd_; int sock_[2]; + std::unique_ptr fuse_server_; uint64_t nodeid_; std::unordered_map lookup_map_;