[RFC PATCH v2 5/8] selftests/fuse: factor-out test fixture setup/teardown

Luis Henriques <[email protected]>
Newsgroups org.kernel.vger.linux-kselftest,dev.linux.lists.fuse-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
In order to reduce new tests setup/teardown code duplication, factor-out
these functions from the existing acl_cache test.

Signed-off-by: Luis Henriques <[email protected]>
---
 .../filesystems/fuse/fuse_acl_cache_test.c    | 82 ++++++++++++-------
 1 file changed, 53 insertions(+), 29 deletions(-)

diff --git a/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c b/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
index 2411a6e285f1..8bdc90572be2 100644
--- a/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
+++ b/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
@@ -50,6 +50,8 @@
 
 #include "kselftest_harness.h"
 
+#define MAX_ERR_MSG 256
+
 /* ---- ACL binary encoding ------------------------------------------------ */
 /*
  * POSIX ACL v2 xattr format (little-endian):
@@ -193,52 +195,74 @@ FIXTURE(acl_cache) {
 	pthread_t            thread;
 };
 
-FIXTURE_SETUP(acl_cache)
+int fs_setup(struct fuse_session **se, char *mountpoint, char *file_path,
+	     pthread_t *thread, char *err)
 {
 	char *fuse_argv[] = { "fuse_acl_cache_test", NULL };
 	struct fuse_args args = FUSE_ARGS_INIT(1, fuse_argv);
 
-	g_ds.acl            = acl_a;
-	g_ds.acl_size       = sizeof(acl_a);
-	g_ds.getxattr_count = 0;
-
-	strcpy(self->mountpoint, "/tmp/acl_cache_test_XXXXXX");
-	if (!mkdtemp(self->mountpoint))
-		SKIP(return, "mkdtemp: %s", strerror(errno));
+	strcpy(mountpoint, "/tmp/acl_cache_test_XXXXXX");
+	if (!mkdtemp(mountpoint)) {
+		snprintf(err, MAX_ERR_MSG, "mkdtemp: %s", strerror(errno));
+		return -1;
+	}
 
-	snprintf(self->file_path, sizeof(self->file_path),
-		 "%s/" FILE_NAME, self->mountpoint);
+	snprintf(file_path, PATH_MAX, "%s/" FILE_NAME, mountpoint);
 
-	self->se = fuse_session_new(&args, &fs_ops, sizeof(fs_ops), NULL);
-	if (!self->se) {
-		rmdir(self->mountpoint);
-		SKIP(return, "fuse_session_new failed");
+	*se = fuse_session_new(&args, &fs_ops, sizeof(fs_ops), NULL);
+	if (!*se) {
+		rmdir(mountpoint);
+		snprintf(err, MAX_ERR_MSG, "fuse_session_new failed");
+		return -1;
 	}
 
-	if (fuse_session_mount(self->se, self->mountpoint)) {
-		fuse_session_destroy(self->se);
-		rmdir(self->mountpoint);
-		SKIP(return, "fuse_session_mount failed "
-			     "(missing fusermount3 or insufficient privileges)");
+	if (fuse_session_mount(*se, mountpoint)) {
+		fuse_session_destroy(*se);
+		rmdir(mountpoint);
+		snprintf(err, MAX_ERR_MSG, "fuse_session_mount failed "
+			"(missing fusermount3 or insufficient privileges)");
+		return -1;
 	}
 
-	if (pthread_create(&self->thread, NULL, run_daemon, self->se)) {
-		fuse_session_unmount(self->se);
-		fuse_session_destroy(self->se);
-		rmdir(self->mountpoint);
-		SKIP(return, "pthread_create: %s", strerror(errno));
+	if (pthread_create(thread, NULL, run_daemon, *se)) {
+		fuse_session_unmount(*se);
+		fuse_session_destroy(*se);
+		rmdir(mountpoint);
+		snprintf(err, MAX_ERR_MSG, "pthread_create: %s", strerror(errno));
+		return -1;
 	}
 
 	fuse_opt_free_args(&args);
+
+	return 0;
+}
+
+static void fs_teardown(struct fuse_session *se, pthread_t thread,
+			char *mountpoint)
+{
+	fuse_session_exit(se);
+	fuse_session_unmount(se);
+	pthread_join(thread, NULL);
+	fuse_session_destroy(se);
+	rmdir(mountpoint);
+}
+
+FIXTURE_SETUP(acl_cache)
+{
+	char err[MAX_ERR_MSG];
+
+	g_ds.acl            = acl_a;
+	g_ds.acl_size       = sizeof(acl_a);
+	g_ds.getxattr_count = 0;
+
+	if (fs_setup(&self->se, self->mountpoint, self->file_path,
+		     &self->thread, err))
+		SKIP(return, err);
 }
 
 FIXTURE_TEARDOWN(acl_cache)
 {
-	fuse_session_exit(self->se);
-	fuse_session_unmount(self->se);
-	pthread_join(self->thread, NULL);
-	fuse_session_destroy(self->se);
-	rmdir(self->mountpoint);
+	fs_teardown(self->se, self->thread, self->mountpoint);
 }
 
 static int do_force_statx(const char *path)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.