Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Mar 2019 18:12:34 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r344890 - projects/fuse2/tests/sys/fs/fuse
Message-ID:  <201903071812.x27ICYKc075837@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
+}
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201903071812.x27ICYKc075837>