@@ -8,6 +8,7 @@
PTESTS_FAST_META_FILESYSTEMS = "\
e2tools \
+ unionfs-fuse \
"
PTESTS_SLOW_META_FILESYSTEMS = "\
new file mode 100644
@@ -0,0 +1,43 @@
+From 8de40703857e63483a5c1b83ee7a5b6323c0b7d3 Mon Sep 17 00:00:00 2001
+From: Gyorgy Sarvari <skandigraun@gmail.com>
+Date: Fri, 26 Dec 2025 19:50:20 +0100
+Subject: [PATCH] adapt tests to ptest
+
+The tests are expected to be executed after compilation, and
+they look for the tested binaries in the build folder. However
+for ptests we want to test the already installed binaries,
+so change the tests to use them.
+
+Also, adapt the fusermount executable name to what's installed
+in the ptest images.
+
+Upstream-Status: Inappropriate [oe-specific]
+Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
+---
+ test_all.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/test_all.py b/test_all.py
+index 6ead5b4..bb167a9 100755
+--- a/test_all.py
++++ b/test_all.py
+@@ -41,8 +41,8 @@ def get_osxfuse_unionfs_mounts():
+
+ class Common:
+ def setUp(self):
+- self.unionfs_path = os.path.abspath('src/unionfs')
+- self.unionfsctl_path = os.path.abspath('src/unionfsctl')
++ self.unionfs_path = 'unionfs'
++ self.unionfsctl_path = 'unionfsctl'
+
+ self.tmpdir = tempfile.mkdtemp()
+ self.original_cwd = os.getcwd()
+@@ -81,7 +81,7 @@ class Common:
+ if platform.system() == 'Darwin':
+ call('umount %s' % self.mount_device)
+ else:
+- call('fusermount -u union')
++ call('fusermount3 -u union')
+
+ os.chdir(self.original_cwd)
+ shutil.rmtree(self.tmpdir)
new file mode 100644
@@ -0,0 +1,58 @@
+From bf552c479a0c0b0ef2d52d8456030c56b8cc6dbb Mon Sep 17 00:00:00 2001
+From: Gyorgy Sarvari <skandigraun@gmail.com>
+Date: Fri, 26 Dec 2025 19:33:54 +0100
+Subject: [PATCH] fix debug ioctl call
+
+When calling the ioctl to set a debug file, the ioctl expects to receive a datatype
+that is specified in the ioctl definition: char[PATHLEN_MAX]
+
+However when passing the pointer from getopts, this is only true if the passed path
+has the maximal allowed length. Since usually this path is shorter than the max,
+the kernel is trying to read over the end of the argument, and returns "EFAULT/Bad address".
+
+To solve this, copy the argument to a buffer that has the exact size of what the ioctl
+expects, and pass this buffer to the ioctl.
+
+Upstream-Status: Submitted [https://github.com/rpodgorny/unionfs-fuse/pull/164]
+Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
+---
+ src/unionfsctl.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/src/unionfsctl.c b/src/unionfsctl.c
+index 74c4d33..efed505 100644
+--- a/src/unionfsctl.c
++++ b/src/unionfsctl.c
+@@ -44,25 +44,28 @@ int main(int argc, char **argv) {
+
+ int opt;
+ const char* argument_param;
++ char debug_file[PATHLEN_MAX];
+ int debug_on_off;
+ int ioctl_res;
+ while ((opt = getopt(argc, argv, "d:p:")) != -1) {
+ switch (opt) {
+ case 'p':
+- argument_param = optarg;
+- if (strlen(argument_param) < 1) {
++ if (strlen(optarg) < 1) {
+ fprintf(stderr,
+ "Not a valid debug path given!\n");
+ print_help(progname);
+ exit(1);
+ }
+
+- if (strlen(argument_param) > PATHLEN_MAX) {
++ if (strlen(optarg) > PATHLEN_MAX) {
+ fprintf(stderr, "Debug path too long!\n");
+ exit(1);
+ }
+
+- ioctl_res = ioctl(fd, UNIONFS_SET_DEBUG_FILE, argument_param);
++ memset(debug_file, 0, PATHLEN_MAX);
++ strncpy(debug_file, optarg, PATHLEN_MAX - 1);
++
++ ioctl_res = ioctl(fd, UNIONFS_SET_DEBUG_FILE, debug_file);
+ if (ioctl_res == -1) {
+ fprintf(stderr, "debug-file ioctl failed: %s\n",
+ strerror(errno) );
new file mode 100644
@@ -0,0 +1,9 @@
+#!/bin/sh
+# not all tests can run with root, so create a test user
+# if it doesn't exist yet
+
+if ! grep ptestuser /etc/shadow; then
+ useradd ptestuser
+fi
+
+su ptestuser -c "python3 -m putao.unittest"
@@ -6,11 +6,20 @@ LIC_FILES_CHKSUM = "file://src/unionfs.c;beginline=3;endline=8;md5=30fa8de70fd8a
file://LICENSE;md5=0e75c95b3e0e1c01489b39e7fadd3e2d \
"
-SRC_URI = "git://github.com/rpodgorny/${BPN}.git;branch=master;protocol=https;tag=v${PV}"
+SRC_URI = "git://github.com/rpodgorny/${BPN}.git;branch=master;protocol=https;tag=v${PV} \
+ file://run-ptest \
+ file://0001-fix-debug-ioctl-call.patch \
+ file://0001-adapt-tests-to-ptest.patch \
+"
+
SRCREV = "3fcbd11f78b9a9e02ea0e861d741840fe45dc9c8"
DEPENDS = "fuse3"
RDEPENDS:${PN} = "bash"
+RDEPENDS:${PN}-ptest += "python3-core python3-unittest python3-unittest-automake-output"
+inherit cmake pkgconfig ptest
-inherit cmake pkgconfig
+do_install_ptest(){
+ install ${S}/test_all.py ${D}${PTEST_PATH}
+}
It takes about a second to execute. Added two patches: - One adapts the testuite to ptest, to test the installed binary instead of testing the one from the build folder. - Another that fixes a bug in unionfsctl, which made the test fail. This patch is submitted upstream. Sample output: root@qemux86-64:~# ptest-runner START: ptest-runner 2025-12-26T19:03 BEGIN: /usr/lib/unionfs-fuse/ptest ptestuser:!:20448:0:99999:7::: PASS: test_all.IOCTL_TestCase.test_debug PASS: test_all.IOCTL_TestCase.test_wrong_args PASS: test_all.UnionFS_Help.test_help [...many lines...] PASS: test_all.UnionFS_RW_RW_PreserveBranch_TestCase.test_permissions_after_creating_directories PASS: test_all.UnionFS_Sync.test_sync PASS: test_all.UnionFS_Version.test_help ============================================================================ Testsuite summary DURATION: 0 END: /usr/lib/unionfs-fuse/ptest 2025-12-26T19:03 STOP: ptest-runner TOTAL: 1 FAIL: 0 Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com> --- .../ptest-packagelists-meta-filesystems.inc | 1 + .../files/0001-adapt-tests-to-ptest.patch | 43 ++++++++++++++ .../files/0001-fix-debug-ioctl-call.patch | 58 +++++++++++++++++++ .../unionfs-fuse/files/run-ptest | 9 +++ .../unionfs-fuse/unionfs-fuse_3.7.bb | 13 ++++- 5 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-adapt-tests-to-ptest.patch create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-fix-debug-ioctl-call.patch create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/run-ptest