]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
tests: Test virFileIsSharedFSOverride
authorJiri Denemark <jdenemar@redhat.com>
Fri, 5 Dec 2025 14:09:15 +0000 (15:09 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 10 Dec 2025 11:40:14 +0000 (12:40 +0100)
Technically virFileIsSharedFSOverride is available on any OS, but we
need a mocked realpath() to test it. Because the virfilemock library
also mocks statfs() which is only available on Linux, we don't even try
to load the library anywhere else. Thus we need to skip testing
virFileIsSharedFSOverride on non-Linux too.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
tests/virfiletest.c

index e05925a321ed2b2280cc92ccdbb9f309778e7f25..ccd76a3fac03fc1d44ca1709afc5e33c700917d3 100644 (file)
@@ -329,6 +329,55 @@ testFileIsSharedFSType(const void *opaque G_GNUC_UNUSED)
 }
 
 
+static const char *shared_filesystems[] = {
+    "/run/user/501/gvfs",
+    "/nfs",
+    "/gluster",
+    "/ceph/multi",
+    "/gpfs/data/blaf",
+    "/quobyte",
+    NULL,
+};
+
+static int
+testFileIsSharedFSOverride(const void *opaque G_GNUC_UNUSED)
+{
+#ifndef __linux__
+    return EXIT_AM_SKIP;
+#else
+    const struct testFileIsSharedFSType *data = opaque;
+    g_autofree char *mtabFile = NULL;
+    bool actual;
+    int ret = -1;
+
+    /* mtab is used by mocked realpath to decide whether a given path exists */
+    mtabFile = g_strdup_printf(abs_srcdir "/virfiledata/%s", data->mtabFile);
+
+    if (!g_setenv("LIBVIRT_MTAB", mtabFile, true)) {
+        fprintf(stderr, "Unable to set env variable\n");
+        goto cleanup;
+    }
+
+    actual = virFileIsSharedFSOverride(data->filename,
+                                       (char * const *) shared_filesystems);
+
+    if (actual != data->expected) {
+        fprintf(stderr, "FS of '%s' is %s. Expected: %s\n",
+                data->filename,
+                actual ? "shared" : "not shared",
+                data->expected ? "shared" : "not shared");
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    g_unsetenv("LIBVIRT_MTAB");
+    return ret;
+#endif
+}
+
+
 static int
 mymain(void)
 {
@@ -439,6 +488,26 @@ mymain(void)
     DO_TEST_FILE_IS_SHARED_FS_TYPE("mounts3.txt", "/gpfs/data", true);
     DO_TEST_FILE_IS_SHARED_FS_TYPE("mounts3.txt", "/quobyte", true);
 
+#define DO_TEST_FILE_IS_SHARED_FS_OVERRIDE(mtab, file, exp) \
+    do { \
+        struct testFileIsSharedFSType data = { \
+            .mtabFile = mtab, .filename = file, .expected = exp \
+        }; \
+        if (virTestRun(virTestCounterNext(), testFileIsSharedFSOverride, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+    virTestCounterReset("testFileIsSharedFSOverride ");
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts2.txt", "/boot/vmlinuz", false);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts2.txt", "/run/user/501/gvfs/some/file", true);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/nfs/file", true);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/gluster/file", true);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/some/symlink/file", true);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/ceph/file", false);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/ceph/multi/file", true);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/gpfs/data", false);
+    DO_TEST_FILE_IS_SHARED_FS_OVERRIDE("mounts3.txt", "/quobyte", true);
+
     return ret != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }