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

Luis Henriques <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,dev.linux.lists.fuse-devel,org.kernel.vger.linux-kselftest
Message-ID <[email protected]>
On Tue, Aug 18 2026, Amir Goldstein wrote:

> On Mon, Aug 17, 2026 at 4:11 PM Luis Henriques <[email protected]> wrote:
>>
>> In order to reduce new tests setup/teardown code duplication, factor-out
>> these functions from the existing acl_cache test.
>
> When I read this I thought you were going to share these helpers with the
> new symlink and readdir cache tests, but you did not.
>
> Maybe a fuse_common.c would make sense to reduce boiler plate
> in new fuse tests.
>
> These helpers and fixture look pretty similar in all three tests.

True.  I'll try to reduce the duplication by moving the common place.

Cheers,
-- 
Luís


> Thanks,
> Amir.
>
>
>>
>> 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.