On Thu, 2023-01-12 at 10:00 -0500, Stefan Berger wrote: > On 1/12/23 07:24, Roberto Sassu wrote: > > From: Roberto Sassu <roberto.sassu@xxxxxxxxxx> > > > > Add the new functions _run_user_mode(), _exit_user_mode(), > > _init_user_mode() and _cleanup_user_mode() to run the tests inside a system > > booted with the UML kernel. > > > > A typical structure of a script with tests is: > > > > trap cleanup SIGINT SIGTERM SIGSEGV EXIT > > > > _cleanup() { > > <test cleanup> > > } > > > > cleanup() { > > _cleanup_user_mode _cleanup > > _report_exit_and_cleanup > > } > > > > <tests implementations> > > > > _run_user_mode ../linux $PWD/$(basename $0) "env_var1=$env_var1 ..." > > > > _exit_user_mode ../linux > > > > _init_user_mode > > > > <tests init> > > > > <tests call> > > > > If the UML_MODE environment variable is not set to 1, ignore the UML kernel > > execution and initialization requests, and perform the cleanup in the > > current environment. Ignore the same also if the script is already run in > > the UML environment, to avoid loops. Instead, for cleanup, do it only in > > the UML environment and skip it in the host environment. > > > > Signal to the host environment failures of tests run in the UML environment > > with an unclean shutdown of the UML kernel. > > > > Add haveged and systemd as dependencies for the tests in ci/fedora.sh, > > respectively for initializing the random number generator and for shutting > > down the system in the environment created by the UML kernel. > > > > Signed-off-by: Roberto Sassu <roberto.sassu@xxxxxxxxxx> > > --- > > ci/fedora.sh | 4 ++- > > tests/functions.sh | 79 +++++++++++++++++++++++++++++++++++++++++++++- > > 2 files changed, 81 insertions(+), 2 deletions(-) > > > > diff --git a/ci/fedora.sh b/ci/fedora.sh > > index e60de7981c60..198034a34e3c 100755 > > --- a/ci/fedora.sh > > +++ b/ci/fedora.sh > > @@ -45,7 +45,9 @@ yum -y install \ > > vim-common \ > > wget \ > > which \ > > - zstd > > + zstd \ > > + haveged \ > > + systemd > > > > yum -y install docbook5-style-xsl || true > > yum -y install swtpm || true > > diff --git a/tests/functions.sh b/tests/functions.sh > > index 8f6f02dfcd95..98829d94fae1 100755 > > --- a/tests/functions.sh > > +++ b/tests/functions.sh > > @@ -267,6 +267,16 @@ _report_exit_and_cleanup() { > > [ $testsfail -gt 0 ] && echo -n "$RED" || echo -n "$NORM" > > echo " FAIL: $testsfail" > > echo "$NORM" > > + # Signal failure to UML caller with an unclean shutdown. > > + if [ -n "$UML_MODE" ] && [ "$UML_MODE" -eq 1 ] && [ $$ -eq 1 ]; then > > + if [ -z "$(which poweroff)" ]; then > > + echo "Warning: cannot properly shutdown system" > > + fi > > + > > + if [ $testsfail -eq 0 ]; then > > + poweroff -f > > + fi > > + fi > > if [ $testsfail -gt 0 ]; then > > exit "$FAIL" > > elif [ $testspass -gt 0 ]; then > > @@ -312,4 +322,71 @@ _softhsm_teardown() { > > rm -rf "${SOFTHSM_SETUP_CONFIGDIR}" > > unset SOFTHSM_SETUP_CONFIGDIR SOFTHSM2_CONF PKCS11_KEYURI \ > > EVMCTL_ENGINE OPENSSL_ENGINE OPENSSL_KEYFORM > > -} > > \ No newline at end of file > > +} > > + > > +# Syntax: _run_user_mode <UML binary> <init> <additional kernel parameters> > > +_run_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -eq 1 ]; then > > + return > > + fi > > + > > + expect_pass $1 rootfstype=hostfs rw init=$2 quiet mem=256M $3 > > +} > > + > > +# Syntax: _exit_user_mode <UML binary> > > +_exit_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -eq 1 ]; then > > + return > > + fi > > + > > + if [ -f "$1" ]; then > > + exit $OK > > + fi > > +} > > + > > +# Syntax: _init_user_mode > > +_init_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -ne 1 ]; then > > + return > > + fi > > + > > + mount -t proc proc /proc > > + mount -t sysfs sysfs /sys > > + mount -t securityfs securityfs /sys/kernel/security > > + > > + if [ -n "$(which haveged 2> /dev/null)" ]; then > > + $(which haveged) -w 1024 &> /dev/null > > + fi > > What's different when it's missing? The boot time is longer, if I remember correctly. Thanks Roberto > > + > > + pushd $PWD > /dev/null > > +} > > + > > +# Syntax: _cleanup_user_mode <cleanup function> > > +_cleanup_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + $1 > > + return > > + fi > > + > > + if [ $$ -ne 1 ]; then > > + return > > + fi > > + > > + $1 > > + > > + umount /sys/kernel/security > > + umount /sys > > + umount /proc > > +} > > Reviewed-by: Stefan Berger <stefanb@xxxxxxxxxxxxx>