unionfs-fuse: add ptest support

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>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Gyorgy Sarvari 2025-12-26 20:10:00 +01:00 committed by Khem Raj
parent d53205ad36
commit cecee4bb94
No known key found for this signature in database
GPG Key ID: BB053355919D3314
5 changed files with 122 additions and 2 deletions

View File

@ -8,6 +8,7 @@
PTESTS_FAST_META_FILESYSTEMS = "\
e2tools \
unionfs-fuse \
"
PTESTS_SLOW_META_FILESYSTEMS = "\

View File

@ -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)

View File

@ -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) );

View File

@ -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"

View File

@ -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}
}