svn commit: r344890 - projects/fuse2/tests/sys/fs/fuse
Alan Somers
asomers at FreeBSD.org
Thu Mar 7 18:12:35 UTC 2019
Author: asomers
Date: Thu Mar 7 18:12:34 2019
New Revision: 344890
URL: https://svnweb.freebsd.org/changeset/base/344890
Log:
fuse(4): add tests relating to open(2) flags
Sponsored by: The FreeBSD Foundation
Modified:
projects/fuse2/tests/sys/fs/fuse/open.cc
Modified: projects/fuse2/tests/sys/fs/fuse/open.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fuse/open.cc Thu Mar 7 15:31:32 2019 (r344889)
+++ projects/fuse2/tests/sys/fs/fuse/open.cc Thu Mar 7 18:12:34 2019 (r344890)
@@ -36,42 +36,65 @@ extern "C" {
using namespace testing;
-class Open: public FuseTest {};
+class Open: public FuseTest {
-/*
- * The fuse daemon fails the request with enoent. This usually indicates a
- * race condition: some other FUSE client removed the file in between when the
- * kernel checked for it with lookup and tried to open it
- */
-TEST_F(Open, enoent)
-{
+public:
+
+/* Test an OK open of a file with the given flags */
+void test_ok(int os_flags, int fuse_flags) {
const char FULLPATH[] = "mountpoint/some_file.txt";
const char RELPATH[] = "some_file.txt";
uint64_t ino = 42;
+ int fd;
EXPECT_LOOKUP(1, 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;
out->body.entry.nodeid = ino;
+ out->body.entry.attr_valid = UINT64_MAX;
}));
EXPECT_CALL(*m_mock, process(
ResultOf([=](auto in) {
return (in->header.opcode == FUSE_OPEN &&
+ in->body.open.flags == (uint32_t)fuse_flags &&
in->header.nodeid == ino);
}, Eq(true)),
_)
- ).WillOnce(Invoke(ReturnErrno(ENOENT)));
- EXPECT_NE(0, open(FULLPATH, O_RDONLY));
- EXPECT_EQ(ENOENT, errno);
+ ).WillOnce(Invoke([](auto in, auto out) {
+ out->header.unique = in->header.unique;
+ out->header.len = sizeof(out->header);
+ SET_OUT_HEADER_LEN(out, open);
+ }));
+
+ /* Until the attr cache is working, we may send an additional GETATTR */
+ EXPECT_CALL(*m_mock, process(
+ ResultOf([=](auto in) {
+ return (in->header.opcode == FUSE_GETATTR &&
+ in->header.nodeid == ino);
+ }, Eq(true)),
+ _)
+ ).WillRepeatedly(Invoke([=](auto in, auto out) {
+ out->header.unique = in->header.unique;
+ SET_OUT_HEADER_LEN(out, attr);
+ out->body.attr.attr.ino = ino; // Must match nodeid
+ out->body.attr.attr.mode = S_IFREG | 0644;
+ }));
+
+ fd = open(FULLPATH, os_flags);
+ EXPECT_LE(0, fd) << strerror(errno);
+ /* Deliberately leak fd. close(2) will be tested in release.cc */
}
+};
+
/*
- * The daemon is responsible for checking file permissions (unless the
- * default_permissions mount option was used)
+ * The fuse daemon fails the request with enoent. This usually indicates a
+ * race condition: some other FUSE client removed the file in between when the
+ * kernel checked for it with lookup and tried to open it
*/
-TEST_F(Open, eperm)
+TEST_F(Open, enoent)
{
const char FULLPATH[] = "mountpoint/some_file.txt";
const char RELPATH[] = "some_file.txt";
@@ -90,24 +113,26 @@ TEST_F(Open, eperm)
in->header.nodeid == ino);
}, Eq(true)),
_)
- ).WillOnce(Invoke(ReturnErrno(EPERM)));
+ ).WillOnce(Invoke(ReturnErrno(ENOENT)));
EXPECT_NE(0, open(FULLPATH, O_RDONLY));
- EXPECT_EQ(EPERM, errno);
+ EXPECT_EQ(ENOENT, errno);
}
-TEST_F(Open, ok)
+/*
+ * The daemon is responsible for checking file permissions (unless the
+ * default_permissions mount option was used)
+ */
+TEST_F(Open, eperm)
{
const char FULLPATH[] = "mountpoint/some_file.txt";
const char RELPATH[] = "some_file.txt";
uint64_t ino = 42;
- int fd;
EXPECT_LOOKUP(1, 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;
out->body.entry.nodeid = ino;
- out->body.entry.attr_valid = UINT64_MAX;
}));
EXPECT_CALL(*m_mock, process(
@@ -116,27 +141,65 @@ TEST_F(Open, ok)
in->header.nodeid == ino);
}, Eq(true)),
_)
- ).WillOnce(Invoke([](auto in, auto out) {
- out->header.unique = in->header.unique;
- out->header.len = sizeof(out->header);
- SET_OUT_HEADER_LEN(out, open);
- }));
+ ).WillOnce(Invoke(ReturnErrno(EPERM)));
+ EXPECT_NE(0, open(FULLPATH, O_RDONLY));
+ EXPECT_EQ(EPERM, errno);
+}
- /* Until the attr cache is working, we may send an additional GETATTR */
- EXPECT_CALL(*m_mock, process(
- ResultOf([=](auto in) {
- return (in->header.opcode == FUSE_GETATTR &&
- in->header.nodeid == ino);
- }, Eq(true)),
- _)
- ).WillRepeatedly(Invoke([=](auto in, auto out) {
- out->header.unique = in->header.unique;
- SET_OUT_HEADER_LEN(out, attr);
- out->body.attr.attr.ino = ino; // Must match nodeid
- out->body.attr.attr.mode = S_IFREG | 0644;
- }));
+/* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236340 */
+TEST_F(Open, DISABLED_o_append)
+{
+ test_ok(O_WRONLY | O_APPEND, O_WRONLY | O_APPEND);
+}
- fd = open(FULLPATH, O_RDONLY);
- EXPECT_LE(0, fd) << strerror(errno);
- /* Deliberately leak fd. close(2) will be tested in release.cc */
+/* The kernel is supposed to filter out this flag */
+TEST_F(Open, o_creat)
+{
+ test_ok(O_WRONLY | O_CREAT, O_WRONLY);
}
+
+/* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236340 */
+TEST_F(Open, DISABLED_o_direct)
+{
+ test_ok(O_WRONLY | O_DIRECT, O_WRONLY | O_DIRECT);
+}
+
+/* The kernel is supposed to filter out this flag */
+TEST_F(Open, o_excl)
+{
+ test_ok(O_WRONLY | O_EXCL, O_WRONLY);
+}
+
+/* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236329 */
+TEST_F(Open, DISABLED_o_exec)
+{
+ test_ok(O_EXEC, O_EXEC);
+}
+
+/* The kernel is supposed to filter out this flag */
+TEST_F(Open, o_noctty)
+{
+ test_ok(O_WRONLY | O_NOCTTY, O_WRONLY);
+}
+
+TEST_F(Open, o_rdonly)
+{
+ test_ok(O_RDONLY, O_RDONLY);
+}
+
+/* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236340 */
+TEST_F(Open, DISABLED_o_trunc)
+{
+ test_ok(O_WRONLY | O_TRUNC, O_WRONLY | O_TRUNC);
+}
+
+TEST_F(Open, o_wronly)
+{
+ test_ok(O_WRONLY, O_WRONLY);
+}
+
+TEST_F(Open, o_rdwr)
+{
+ test_ok(O_RDWR, O_RDWR);
+}
+
More information about the svn-src-projects
mailing list