summaryrefslogtreecommitdiffhomepage
path: root/test/fuse/linux/stat_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/fuse/linux/stat_test.cc')
-rw-r--r--test/fuse/linux/stat_test.cc85
1 files changed, 34 insertions, 51 deletions
diff --git a/test/fuse/linux/stat_test.cc b/test/fuse/linux/stat_test.cc
index 172e09867..c2e5bd1cf 100644
--- a/test/fuse/linux/stat_test.cc
+++ b/test/fuse/linux/stat_test.cc
@@ -33,20 +33,6 @@ namespace {
class StatTest : public FuseTest {
public:
- bool CompareRequest(void* expected_mem, size_t expected_len, void* real_mem,
- size_t real_len) override {
- if (expected_len != real_len) return false;
- struct fuse_in_header* real_header =
- reinterpret_cast<fuse_in_header*>(real_mem);
-
- if (real_header->opcode != FUSE_GETATTR) {
- std::cerr << "expect header opcode " << FUSE_GETATTR << " but got "
- << real_header->opcode << std::endl;
- return false;
- }
- return true;
- }
-
bool StatsAreEqual(struct stat expected, struct stat actual) {
// device number will be dynamically allocated by kernel, we cannot know
// in advance
@@ -56,25 +42,9 @@ class StatTest : public FuseTest {
};
TEST_F(StatTest, StatNormal) {
- struct iovec iov_in[2];
- struct iovec iov_out[2];
-
- struct fuse_in_header in_header = {
- .len = sizeof(struct fuse_in_header) + sizeof(struct fuse_getattr_in),
- .opcode = FUSE_GETATTR,
- .unique = 4,
- .nodeid = 1,
- .uid = 0,
- .gid = 0,
- .pid = 4,
- .padding = 0,
- };
- struct fuse_getattr_in in_payload = {0};
- iov_in[0].iov_len = sizeof(in_header);
- iov_in[0].iov_base = &in_header;
- iov_in[1].iov_len = sizeof(in_payload);
- iov_in[1].iov_base = &in_payload;
-
+ // Set up fixture.
+ std::vector<struct iovec> iov_in(2);
+ std::vector<struct iovec> iov_out(2);
mode_t expected_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
struct timespec atime = {.tv_sec = 1595436289, .tv_nsec = 134150844};
struct timespec mtime = {.tv_sec = 1595436290, .tv_nsec = 134150845};
@@ -82,7 +52,6 @@ TEST_F(StatTest, StatNormal) {
struct fuse_out_header out_header = {
.len = sizeof(struct fuse_out_header) + sizeof(struct fuse_attr_out),
.error = 0,
- .unique = 4,
};
struct fuse_attr attr = {
.ino = 1,
@@ -109,11 +78,13 @@ TEST_F(StatTest, StatNormal) {
iov_out[1].iov_len = sizeof(out_payload);
iov_out[1].iov_base = &out_payload;
- SetExpected(iov_in, 2, iov_out, 2);
+ SetServerResponse(FUSE_GETATTR, iov_out);
+ // Do integration test.
struct stat stat_buf;
EXPECT_THAT(stat(mount_point_.path().c_str(), &stat_buf), SyscallSucceeds());
+ // Check filesystem operation result.
struct stat expected_stat = {
.st_ino = attr.ino,
.st_nlink = attr.nlink,
@@ -129,38 +100,50 @@ TEST_F(StatTest, StatNormal) {
.st_ctim = ctime,
};
EXPECT_TRUE(StatsAreEqual(stat_buf, expected_stat));
- WaitCompleted();
-}
-
-TEST_F(StatTest, StatNotFound) {
- struct iovec iov_in[2];
- struct iovec iov_out[2];
- struct fuse_in_header in_header = {
- .len = sizeof(struct fuse_in_header) + sizeof(struct fuse_getattr_in),
- .opcode = FUSE_GETATTR,
- .unique = 4,
- };
- struct fuse_getattr_in in_payload = {0};
+ // Check FUSE request.
+ struct fuse_in_header in_header;
+ struct fuse_getattr_in in_payload;
iov_in[0].iov_len = sizeof(in_header);
iov_in[0].iov_base = &in_header;
iov_in[1].iov_len = sizeof(in_payload);
iov_in[1].iov_base = &in_payload;
+ GetServerActualRequest(iov_in);
+ EXPECT_EQ(in_header.opcode, FUSE_GETATTR);
+ EXPECT_EQ(in_payload.getattr_flags, 0);
+ EXPECT_EQ(in_payload.fh, 0);
+}
+
+TEST_F(StatTest, StatNotFound) {
+ // Set up fixture.
+ std::vector<struct iovec> iov_in(2);
+ std::vector<struct iovec> iov_out(1);
struct fuse_out_header out_header = {
.len = sizeof(struct fuse_out_header),
.error = -ENOENT,
- .unique = 4,
};
iov_out[0].iov_len = sizeof(out_header);
iov_out[0].iov_base = &out_header;
+ SetServerResponse(FUSE_GETATTR, iov_out);
- SetExpected(iov_in, 2, iov_out, 1);
-
+ // Do integration test.
struct stat stat_buf;
EXPECT_THAT(stat(mount_point_.path().c_str(), &stat_buf),
SyscallFailsWithErrno(ENOENT));
- WaitCompleted();
+
+ // Check FUSE request.
+ struct fuse_in_header in_header;
+ struct fuse_getattr_in in_payload;
+ iov_in[0].iov_len = sizeof(in_header);
+ iov_in[0].iov_base = &in_header;
+ iov_in[1].iov_len = sizeof(in_payload);
+ iov_in[1].iov_base = &in_payload;
+
+ GetServerActualRequest(iov_in);
+ EXPECT_EQ(in_header.opcode, FUSE_GETATTR);
+ EXPECT_EQ(in_payload.getattr_flags, 0);
+ EXPECT_EQ(in_payload.fh, 0);
}
} // namespace