From fec38819acc9a95a7ed18b8f103fb5d9a59c3c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 17 May 2023 17:04:57 +0200 Subject: [PATCH] tests/dbusrunner: Use separate HOME, Temp and XDG Runtime dirs We need to use a different $XDG_RUNTIME_DIR path to be able to start most tests in parallel, and we can use a temporary directory for that which python cleans up when done. Also, given that most of settings are stored in HOME use temporary one for that too, to prevent mutter to fail because it may load some local configuration (e.g. monitors.xml) that don't meet the expectations or that may change the test behavior in an unexpected way. As per this, CI needs to be adapted for new args handling Part-of: --- .gitlab-ci.yml | 2 ++ src/tests/kvm/meson.build | 2 +- src/tests/kvm/virtme-run.sh | 5 +++++ src/tests/mutter_dbusrunner.py | 29 ++++++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cddadc3b0..f82f34900 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -518,6 +518,7 @@ build-wayland-only@x86_64: ./src/tests/meta-dbus-runner.py --launch=pipewire --launch=wireplumber + -- meson test -C build --setup plain @@ -680,6 +681,7 @@ dist-mutter: ./src/tests/meta-dbus-runner.py --launch=pipewire --launch=wireplumber + -- meson dist -C build artifacts: expire_in: 7 day diff --git a/src/tests/kvm/meson.build b/src/tests/kvm/meson.build index 94de0db97..9206dbf69 100644 --- a/src/tests/kvm/meson.build +++ b/src/tests/kvm/meson.build @@ -50,7 +50,7 @@ foreach test_case: privileged_tests args: [ kernel_image_path, meta_dbus_runner.full_path(), - '--kvm', + '--kvm --', meson.current_build_dir(), vm_env, kvm_wrapper, diff --git a/src/tests/kvm/virtme-run.sh b/src/tests/kvm/virtme-run.sh index d712864e0..3ec8099e2 100755 --- a/src/tests/kvm/virtme-run.sh +++ b/src/tests/kvm/virtme-run.sh @@ -40,6 +40,10 @@ SCRIPT="\ $(printf "\"%s\" " "${@:6}")\ " +if [ -v "$MUTTER_TEST_ROOT" ]; then + ISOLATE_DIRS_ARGS="--rwdir=$MUTTER_TEST_ROOT" +fi + echo Running tests in virtual machine ... virtme-run \ --memory=1024M \ @@ -47,6 +51,7 @@ virtme-run \ --pwd \ --kimg "$IMAGE" \ --script-sh "sh -c \"$SCRIPT\"" \ + $ISOLATE_DIRS_ARGS \ --qemu-opts -cpu host,pdcm=off -smp 2 VM_RESULT=$? if [ $VM_RESULT != 0 ]; then diff --git a/src/tests/mutter_dbusrunner.py b/src/tests/mutter_dbusrunner.py index 2954d09e8..8d5893b16 100644 --- a/src/tests/mutter_dbusrunner.py +++ b/src/tests/mutter_dbusrunner.py @@ -8,6 +8,7 @@ import subprocess import getpass import argparse import logind_helpers +import tempfile from collections import OrderedDict from dbusmock import DBusTestCase from dbus.mainloop.glib import DBusGMainLoop @@ -286,12 +287,38 @@ def meta_run(klass): parser = argparse.ArgumentParser() parser.add_argument('--kvm', action='store_true', default=False) parser.add_argument('--launch', action='append', default=[]) + parser.add_argument('--no-isolate-dirs', action='store_true', default=False) (args, rest) = parser.parse_known_args(sys.argv) rest.pop(0) + if not rest: + parser.error('Command or separator `--` not found') if rest[0] == '--': - rest.pop(0) + rest.pop(0) + else: + print('WARNING: Command or separator `--` not found', file=sys.stderr) + if args.no_isolate_dirs: + return meta_run_klass(klass, args, rest) + + test_root = os.getenv('MUTTER_DBUS_RUNNER_TEST_ROOT') + if test_root: + print('Reusing MUTTER_DBUS_RUNNER_TEST_ROOT', test_root, file=sys.stderr) + return meta_run_klass(klass, args, rest) + + with tempfile.TemporaryDirectory(prefix='mutter-testroot-', + ignore_cleanup_errors=True) as test_root: + env_dirs = ['HOME', 'TMPDIR', 'XDG_RUNTIME_DIR', 'XDG_CONFIG_DIR'] + os.environ['MUTTER_DBUS_RUNNER_TEST_ROOT'] = test_root + print('Setup MUTTER_DBUS_RUNNER_TEST_ROOT as', test_root, file=sys.stderr) + for env_dir in env_dirs: + directory = os.path.join(test_root, env_dir.lower()) + os.mkdir(directory, mode=0o700) + os.environ[env_dir] = directory + print('Setup', env_dir, 'as', directory, file=sys.stderr) + return meta_run_klass(klass, args, rest) + +def meta_run_klass(klass, args, rest): result = 1 if os.getenv('META_DBUS_RUNNER_ACTIVE') == None: