From owner-svn-src-projects@freebsd.org Tue Mar 5 03:27:35 2019 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 027F7150DA16 for ; Tue, 5 Mar 2019 03:27:35 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id A37887334E; Tue, 5 Mar 2019 03:27:34 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 93586E1BF; Tue, 5 Mar 2019 03:27:34 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x253RYW6068768; Tue, 5 Mar 2019 03:27:34 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x253RWCe068758; Tue, 5 Mar 2019 03:27:32 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <201903050327.x253RWCe068758@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Tue, 5 Mar 2019 03:27:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r344789 - projects/fuse2/tests/sys/fs/fuse X-SVN-Group: projects X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: projects/fuse2/tests/sys/fs/fuse X-SVN-Commit-Revision: 344789 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: A37887334E X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.97 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.97)[-0.973,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Mar 2019 03:27:35 -0000 Author: asomers Date: Tue Mar 5 03:27:32 2019 New Revision: 344789 URL: https://svnweb.freebsd.org/changeset/base/344789 Log: fuse(4): combine some common code in the tests Sponsored by: The FreeBSD Foundation Modified: projects/fuse2/tests/sys/fs/fuse/Makefile projects/fuse2/tests/sys/fs/fuse/create.cc projects/fuse2/tests/sys/fs/fuse/getattr.cc projects/fuse2/tests/sys/fs/fuse/lookup.cc projects/fuse2/tests/sys/fs/fuse/mknod.cc projects/fuse2/tests/sys/fs/fuse/mockfs.cc projects/fuse2/tests/sys/fs/fuse/mockfs.hh projects/fuse2/tests/sys/fs/fuse/open.cc projects/fuse2/tests/sys/fs/fuse/readlink.cc projects/fuse2/tests/sys/fs/fuse/setattr.cc projects/fuse2/tests/sys/fs/fuse/symlink.cc Modified: projects/fuse2/tests/sys/fs/fuse/Makefile ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/Makefile Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/Makefile Tue Mar 5 03:27:32 2019 (r344789) @@ -7,6 +7,7 @@ TESTSDIR= ${TESTSBASE}/sys/fs/fuse ATF_TESTS_CXX+= create ATF_TESTS_CXX+= getattr ATF_TESTS_CXX+= lookup +#ATF_TESTS_CXX+= mkdir ATF_TESTS_CXX+= mknod ATF_TESTS_CXX+= open ATF_TESTS_CXX+= readlink @@ -27,6 +28,11 @@ SRCS.lookup+= getmntopts.c SRCS.lookup+= lookup.cc SRCS.lookup+= mockfs.cc SRCS.lookup+= utils.cc + +#SRCS.mkdir+= getmntopts.c +#SRCS.mkdir+= mockfs.cc +#SRCS.mkdir+= mkdir.cc +#SRCS.mkdir+= utils.cc SRCS.mknod+= getmntopts.c SRCS.mknod+= mockfs.cc Modified: projects/fuse2/tests/sys/fs/fuse/create.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/create.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/create.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -51,17 +51,7 @@ TEST_F(Create, DISABLED_attr_cache) uint64_t ino = 42; int fd; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -104,17 +94,7 @@ TEST_F(Create, eexist) const char RELPATH[] = "some_file.txt"; mode_t mode = 0755; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -124,11 +104,7 @@ TEST_F(Create, eexist) (0 == strcmp(RELPATH, name))); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -EEXIST; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(EEXIST))); EXPECT_NE(0, open(FULLPATH, O_CREAT | O_EXCL, mode)); EXPECT_EQ(EEXIST, errno); } @@ -146,17 +122,7 @@ TEST_F(Create, DISABLED_Enosys) uint64_t ino = 42; int fd; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -166,11 +132,7 @@ TEST_F(Create, DISABLED_Enosys) (0 == strcmp(RELPATH, name))); }, Eq(true)), _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOSYS; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(ENOSYS))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -235,13 +197,7 @@ TEST_F(Create, DISABLED_entry_cache_negative) int fd; /* create will first do a LOOKUP, adding a negative cache entry */ - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { /* nodeid means ENOENT and cache it */ out->body.entry.nodeid = 0; out->header.unique = in->header.unique; @@ -304,13 +260,7 @@ TEST_F(Create, DISABLED_entry_cache_negative_purge) int fd; /* create will first do a LOOKUP, adding a negative cache entry */ - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).Times(1) + EXPECT_LOOKUP(RELPATH).Times(1) .WillOnce(Invoke([=](auto in, auto out) { /* nodeid means ENOENT and cache it */ out->body.entry.nodeid = 0; @@ -355,13 +305,7 @@ TEST_F(Create, DISABLED_entry_cache_negative_purge) ASSERT_LE(0, fd) << strerror(errno); /* Finally, a subsequent lookup should query the daemon */ - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).Times(1) + EXPECT_LOOKUP(RELPATH).Times(1) .WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; out->header.error = 0; @@ -384,17 +328,7 @@ TEST_F(Create, eperm) const char RELPATH[] = "some_file.txt"; mode_t mode = 0755; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -404,11 +338,7 @@ TEST_F(Create, eperm) (0 == strcmp(RELPATH, name))); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -EPERM; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(EPERM))); EXPECT_NE(0, open(FULLPATH, O_CREAT | O_EXCL, mode)); EXPECT_EQ(EPERM, errno); } @@ -421,17 +351,7 @@ TEST_F(Create, ok) uint64_t ino = 42; int fd; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { Modified: projects/fuse2/tests/sys/fs/fuse/getattr.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/getattr.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/getattr.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -47,13 +47,7 @@ TEST_F(Getattr, DISABLED_attr_cache) const uint64_t generation = 13; struct stat sb; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillRepeatedly(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillRepeatedly(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -97,13 +91,7 @@ TEST_F(Getattr, attr_cache_timeout) */ long timeout_ns = 250'000'000; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillRepeatedly(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillRepeatedly(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.entry_valid = UINT64_MAX; @@ -139,13 +127,7 @@ TEST_F(Getattr, enoent) struct stat sb; const uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = 0100644; @@ -158,11 +140,7 @@ TEST_F(Getattr, enoent) in->header.nodeid == ino); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_NE(0, stat(FULLPATH, &sb)); EXPECT_EQ(ENOENT, errno); } @@ -175,13 +153,7 @@ TEST_F(Getattr, ok) const uint64_t generation = 13; struct stat sb; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; Modified: projects/fuse2/tests/sys/fs/fuse/lookup.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/lookup.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/lookup.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -50,13 +50,7 @@ TEST_F(Lookup, DISABLED_attr_cache) const uint64_t ino = 42; struct stat sb; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.nodeid = ino; @@ -121,13 +115,7 @@ TEST_F(Lookup, attr_cache_timeout) */ long timeout_ns = 250'000'000; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillRepeatedly(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillRepeatedly(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.nodeid = ino; @@ -157,17 +145,11 @@ TEST_F(Lookup, attr_cache_timeout) TEST_F(Lookup, enoent) { - EXPECT_CALL(*m_mock, process( - ResultOf([](auto in) { - return (in->header.opcode == FUSE_LOOKUP); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); - EXPECT_NE(0, access("mountpoint/does_not_exist", F_OK)); + const char FULLPATH[] = "mountpoint/does_not_exist"; + const char RELPATH[] = "does_not_exist"; + + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); + EXPECT_NE(0, access(FULLPATH, F_OK)); EXPECT_EQ(ENOENT, errno); } @@ -180,13 +162,7 @@ TEST_F(Lookup, entry_cache) const char FULLPATH[] = "mountpoint/some_file.txt"; const char RELPATH[] = "some_file.txt"; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.entry_valid = UINT64_MAX; @@ -205,12 +181,7 @@ TEST_F(Lookup, entry_cache) /* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236226 */ TEST_F(Lookup, DISABLED_entry_cache_negative) { - EXPECT_CALL(*m_mock, process( - ResultOf([](auto in) { - return (in->header.opcode == FUSE_LOOKUP); - }, Eq(true)), - _) - ).Times(1) + EXPECT_LOOKUP("does_not_exist").Times(1) .WillOnce(Invoke([](auto in, auto out) { out->header.unique = in->header.unique; out->header.error = 0; @@ -227,18 +198,15 @@ TEST_F(Lookup, DISABLED_entry_cache_negative) /* Negative entry caches should timeout, too */ TEST_F(Lookup, entry_cache_negative_timeout) { + const char *RELPATH = "does_not_exist"; + const char *FULLPATH = "mountpoint/does_not_exist"; /* * The timeout should be longer than the longest plausible time the * daemon would take to complete a write(2) to /dev/fuse, but no longer. */ long timeout_ns = 250'000'000; - EXPECT_CALL(*m_mock, process( - ResultOf([](auto in) { - return (in->header.opcode == FUSE_LOOKUP); - }, Eq(true)), - _) - ).Times(2) + EXPECT_LOOKUP(RELPATH).Times(2) .WillRepeatedly(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; out->header.error = 0; @@ -246,13 +214,13 @@ TEST_F(Lookup, entry_cache_negative_timeout) out->body.entry.entry_valid_nsec = timeout_ns; SET_OUT_HEADER_LEN(out, entry); })); - EXPECT_NE(0, access("mountpoint/does_not_exist", F_OK)); + EXPECT_NE(0, access(FULLPATH, F_OK)); EXPECT_EQ(ENOENT, errno); usleep(2 * timeout_ns / 1000); /* The cache has timed out; VOP_LOOKUP should requery the daemon*/ - EXPECT_NE(0, access("mountpoint/does_not_exist", F_OK)); + EXPECT_NE(0, access(FULLPATH, F_OK)); EXPECT_EQ(ENOENT, errno); } @@ -271,13 +239,7 @@ TEST_F(Lookup, DISABLED_entry_cache_timeout) */ long timeout_ns = 250'000'000; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).Times(2) + EXPECT_LOOKUP(RELPATH).Times(2) .WillRepeatedly(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); @@ -296,13 +258,7 @@ TEST_F(Lookup, ok) const char FULLPATH[] = "mountpoint/some_file.txt"; const char RELPATH[] = "some_file.txt"; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; Modified: projects/fuse2/tests/sys/fs/fuse/mknod.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/mknod.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/mknod.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -54,17 +54,7 @@ void test_ok(mode_t mode, dev_t dev) { const char RELPATH[] = "some_file.txt"; uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -118,17 +108,7 @@ TEST_F(Mknod, DISABLED_eperm) const char RELPATH[] = "some_file.txt"; mode_t mode = S_IFIFO | 0755; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -139,11 +119,7 @@ TEST_F(Mknod, DISABLED_eperm) (0 == strcmp(RELPATH, name))); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -EPERM; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(EPERM))); EXPECT_NE(0, mknod(FULLPATH, mode, 0)); EXPECT_EQ(EPERM, errno); } Modified: projects/fuse2/tests/sys/fs/fuse/mockfs.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/mockfs.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/mockfs.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -102,6 +102,16 @@ const char* opcode2opname(uint32_t opcode) return (table[opcode]); } +std::function +ReturnErrno(int error) +{ + return([=](auto in, auto out) { + out->header.unique = in->header.unique; + out->header.error = -error; + out->header.len = sizeof(out->header); + }); +} + void sigint_handler(int __unused sig) { quit = 1; } Modified: projects/fuse2/tests/sys/fs/fuse/mockfs.hh ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/mockfs.hh Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/mockfs.hh Tue Mar 5 03:27:32 2019 (r344789) @@ -42,6 +42,22 @@ extern "C" { sizeof((out)->body.variant)); \ } +/* + * Create an expectation on FUSE_LOOKUP and return it so the caller can set + * actions. + * + * This must be a macro instead of a method because EXPECT_CALL returns a type + * with a deleted constructor. + */ +#define EXPECT_LOOKUP(path) \ + EXPECT_CALL(*m_mock, process( \ + ResultOf([=](auto in) { \ + return (in->header.opcode == FUSE_LOOKUP && \ + strcmp(in->body.lookup, (path)) == 0); \ + }, Eq(true)), \ + _) \ + ) + extern int verbosity; /* This struct isn't defined by fuse_kernel.h or libfuse, but it should be */ @@ -83,6 +99,13 @@ struct mockfs_buf_out { fuse_out_header header; union fuse_payloads_out body; }; + +/* + * Helper function used for setting an error expectation for any fuse operation. + * The operation will return the supplied error + */ +std::function +ReturnErrno(int error); /* * Fake FUSE filesystem Modified: projects/fuse2/tests/sys/fs/fuse/open.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/open.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/open.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -49,13 +49,7 @@ TEST_F(Open, enoent) const char RELPATH[] = "some_file.txt"; uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -68,11 +62,7 @@ TEST_F(Open, enoent) in->header.nodeid == ino); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_NE(0, open(FULLPATH, O_RDONLY)); EXPECT_EQ(ENOENT, errno); } @@ -87,13 +77,7 @@ TEST_F(Open, eperm) const char RELPATH[] = "some_file.txt"; uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -106,11 +90,7 @@ TEST_F(Open, eperm) in->header.nodeid == ino); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -EPERM; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(EPERM))); EXPECT_NE(0, open(FULLPATH, O_RDONLY)); EXPECT_EQ(EPERM, errno); } @@ -122,13 +102,7 @@ TEST_F(Open, ok) uint64_t ino = 42; int fd; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; Modified: projects/fuse2/tests/sys/fs/fuse/readlink.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/readlink.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/readlink.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -45,13 +45,7 @@ TEST_F(Readlink, eloop) const uint64_t ino = 42; char buf[80]; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFLNK | 0777; @@ -64,13 +58,8 @@ TEST_F(Readlink, eloop) in->header.nodeid == ino); }, Eq(true)), _) - ).WillOnce(Invoke([=](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ELOOP; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(ELOOP))); - EXPECT_EQ(-1, readlink(FULLPATH, buf, sizeof(buf))); EXPECT_EQ(ELOOP, errno); } @@ -83,13 +72,7 @@ TEST_F(Readlink, ok) const uint64_t ino = 42; char buf[80]; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFLNK | 0777; Modified: projects/fuse2/tests/sys/fs/fuse/setattr.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/setattr.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/setattr.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -50,13 +50,7 @@ TEST_F(Setattr, chmod) const mode_t oldmode = 0755; const mode_t newmode = 0644; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | oldmode; @@ -94,13 +88,7 @@ TEST_F(Setattr, chown) const uid_t olduser = 33; const uid_t newuser = 44; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -144,13 +132,7 @@ TEST_F(Setattr, eperm) const char RELPATH[] = "some_file.txt"; const uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0777; @@ -165,11 +147,7 @@ TEST_F(Setattr, eperm) in->header.nodeid == ino); }, Eq(true)), _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -EPERM; - out->header.len = sizeof(out->header); - })); + ).WillOnce(Invoke(ReturnErrno(EPERM))); EXPECT_NE(0, truncate(FULLPATH, 10)); EXPECT_EQ(EPERM, errno); } @@ -184,13 +162,7 @@ TEST_F(Setattr, fchmod) const mode_t oldmode = 0755; const mode_t newmode = 0644; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | oldmode; @@ -258,13 +230,7 @@ TEST_F(Setattr, ftruncate) const off_t oldsize = 99; const off_t newsize = 12345; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0755; @@ -333,13 +299,7 @@ TEST_F(Setattr, truncate) { const uint64_t oldsize = 100'000'000; const uint64_t newsize = 20'000'000; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -381,13 +341,7 @@ TEST_F(Setattr, utimensat) { {.tv_sec = 7, .tv_nsec = 8}, }; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; @@ -463,13 +417,7 @@ TEST_F(Setattr, utimensat_mtime_only) { {.tv_sec = 7, .tv_nsec = 8}, }; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([=](auto in, auto out) { + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke([=](auto in, auto out) { out->header.unique = in->header.unique; SET_OUT_HEADER_LEN(out, entry); out->body.entry.attr.mode = S_IFREG | 0644; Modified: projects/fuse2/tests/sys/fs/fuse/symlink.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fuse/symlink.cc Tue Mar 5 02:53:41 2019 (r344788) +++ projects/fuse2/tests/sys/fs/fuse/symlink.cc Tue Mar 5 03:27:32 2019 (r344789) @@ -43,19 +43,8 @@ TEST_F(Symlink, enospc) const char FULLPATH[] = "mountpoint/lnk"; const char RELPATH[] = "lnk"; const char dst[] = "dst"; - //const uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { @@ -84,17 +73,7 @@ TEST_F(Symlink, ok) const char dst[] = "dst"; const uint64_t ino = 42; - EXPECT_CALL(*m_mock, process( - ResultOf([=](auto in) { - return (in->header.opcode == FUSE_LOOKUP && - strcmp(in->body.lookup, RELPATH) == 0); - }, Eq(true)), - _) - ).WillOnce(Invoke([](auto in, auto out) { - out->header.unique = in->header.unique; - out->header.error = -ENOENT; - out->header.len = sizeof(out->header); - })); + EXPECT_LOOKUP(RELPATH).WillOnce(Invoke(ReturnErrno(ENOENT))); EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) {