This was a tough nut to crack. Spent 3-4 calendar weeks (getting blurry now) to try and figure it all out. In the end, the following changes were necessary: - Ensure setup-root.sh is guaranteed to run before any of the tests - Give all tests their unique /etc, /tmp, and /run inside the chroot. Turns out tmpfs+overlayfs can be used unprivileged inside an unshare - A static BusyBox binary with support for mount helpers so we can do the mkdir magic in skel/etc/fstab for the /etc overlay The last item turned out to be a bit of a roller coaster ride of its own. First of all, the original binary we used was from the upstream BusyBox project[1]. I was sure it couldn't be that hard to enable the CONFIG_FEATURE_MOUNT_HELPERS ... oh boy was I wrong. To make long and tedious story short; two new projects on GitHub were created for this task: 1) troglobit/misc[2] to house a mirror of https://musl.cc toolchains and 2) troglobit/busybox-builder[3] to download, patch, and build the thing using a .config from the myLinux[4] project. Patching this .config was necessary, however, since musl libc is strict POSIX and does not have any of the BSD extensions, e.g. REG_STARTEND that is in GLIBC regex(3). [1]: https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/ [2]: https://github.com/troglobit/misc/releases/tag/11-20211120 [3]: https://github.com/troglobit/busybox-builder/releases/tag/1_35_0 [4]: https://github.com/troglobit/myLinux Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
Finit Test Suite
Finit comes with a set of tests and a small framework for running them. Contributors are encouraged to write new tests when implementing features, or fixing bugs.
Each test is run in isolation, in it's own namespace. Finit will therefore be able to be launched as PID 1. Since it's also running with it's own root directory it will be able to function properly without having any super user privileges in the host environment.
Running tests
To run the test suite, first build Finit, e.g:
./configure --prefix=/usr --exec-prefix= --sysconfdir=/etc --localstatedir=/var
make -j9 clean all
Then run (parallel does not work atm):
make check
make check will set up the required assets for the test environment, and then
run the full set of tests. The environment is not removed afterwards so at
this point individual tests can be executed without having to run the entire
test suite, which is handy when developing new tests or debugging existing
test. To execute an individual test, simply invoke the script containing it:
./test/name-of-the-test.sh
Another way to run a single (or more) test(s) is to define the TESTS
environment variable:
TESTS="start-kill-service" make check