mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Merge pull request #7138 from avagin:fuse-test
PiperOrigin-RevId: 426270625
This commit is contained in:
+70
-76
@@ -2,83 +2,77 @@ 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:mount_test",
|
||||
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",
|
||||
)
|
||||
|
||||
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#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<ScopedThread>([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<FuseTestCmd>(cmd)) {
|
||||
case FuseTestCmd::kSetResponse:
|
||||
|
||||
@@ -25,8 +25,10 @@
|
||||
#include <vector>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/memory/memory.h"
|
||||
#include "test/util/posix_error.h"
|
||||
#include "test/util/temp_path.h"
|
||||
#include "test/util/thread_util.h"
|
||||
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
@@ -236,6 +238,7 @@ class FuseTest : public ::testing::Test {
|
||||
|
||||
int dev_fd_;
|
||||
int sock_[2];
|
||||
std::unique_ptr<ScopedThread> fuse_server_;
|
||||
|
||||
uint64_t nodeid_;
|
||||
std::unordered_map<std::string, FuseMemBlock> lookup_map_;
|
||||
|
||||
Reference in New Issue
Block a user