diff options
-rw-r--r-- | .gitlab-ci.yml | 2 | ||||
-rw-r--r-- | plugins/power/gsd-backlight.c | 55 | ||||
-rw-r--r-- | plugins/power/meson.build | 3 | ||||
-rwxr-xr-x | plugins/power/test-backlight-helper | 5 | ||||
-rwxr-xr-x | plugins/power/test.py | 46 |
5 files changed, 60 insertions, 51 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 23e0ed2c..cf476f95 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,7 +12,7 @@ variables: libXtst-devel libwacom-devel meson NetworkManager-libnm-devel nss-devel perl-interpreter polkit-devel pulseaudio-libs-devel pygobject3 python3-dbusmock upower-devel wayland-devel which xorg-x11-drv-wacom-devel xorg-x11-server-Xvfb xorg-x11-utils mutter - mesa-dri-drivers + mesa-dri-drivers umockdev before_script: diff --git a/plugins/power/gsd-backlight.c b/plugins/power/gsd-backlight.c index 39693a75..259a0de7 100644 --- a/plugins/power/gsd-backlight.c +++ b/plugins/power/gsd-backlight.c @@ -25,8 +25,6 @@ #include "gsd-power-constants.h" #include "gsd-power-manager.h" -#define MOCK_BRIGHTNESS_FILE "GSD_MOCK_brightness" - #ifdef HAVE_GUDEV #include <gudev/gudev.h> #endif /* HAVE_GUDEV */ @@ -341,6 +339,7 @@ gsd_backlight_run_set_helper (GsdBacklight *backlight, GTask *task) { GSubprocess *proc = NULL; BacklightHelperData *data = g_task_get_task_data (task); + const gchar *gsd_backlight_helper = NULL; GError *error = NULL; g_assert (backlight->active_task == NULL); @@ -349,12 +348,23 @@ gsd_backlight_run_set_helper (GsdBacklight *backlight, GTask *task) if (data->value_str == NULL) data->value_str = g_strdup_printf ("%d", data->value); - proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, - &error, - "pkexec", - LIBEXECDIR "/gsd-backlight-helper", - g_udev_device_get_sysfs_path (backlight->udev_device), - data->value_str, NULL); + /* This is solely for use by the test environment. If given, execute + * this helper instead of the internal helper using pkexec */ + gsd_backlight_helper = g_getenv ("GSD_BACKLIGHT_HELPER"); + if (!gsd_backlight_helper) { + proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, + &error, + "pkexec", + LIBEXECDIR "/gsd-backlight-helper", + g_udev_device_get_sysfs_path (backlight->udev_device), + data->value_str, NULL); + } else { + proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, + &error, + gsd_backlight_helper, + g_udev_device_get_sysfs_path (backlight->udev_device), + data->value_str, NULL); + } if (proc == NULL) { gsd_backlight_set_helper_return (backlight, task, -1, error); @@ -452,22 +462,6 @@ gsd_backlight_set_brightness_val_async (GsdBacklight *backlight, task = g_task_new (backlight, cancellable, callback, user_data); - if (is_mocked ()) { - g_autofree gchar *contents = NULL; - g_debug ("Setting mock brightness: %d", value); - - contents = g_strdup_printf ("%d", value); - if (!g_file_set_contents (MOCK_BRIGHTNESS_FILE, contents, -1, &error)) { - g_warning ("Setting mock brightness failed: %s", error->message); - g_task_return_error (task, error); - } - priv->brightness_val = priv->brightness_target; - g_object_notify_by_pspec (G_OBJECT (backlight), props[PROP_BRIGHTNESS]); - g_task_return_int (task, gsd_backlight_get_brightness (backlight, NULL)); - - return; - } - #ifdef HAVE_GUDEV if (backlight->udev_device != NULL) { BacklightHelperData *task_data; @@ -720,19 +714,6 @@ gsd_backlight_initable_init (GInitable *initable, return FALSE; } - /* If mocked, set as available and set the brightness (which will also - * create the file for the test environment). */ - if (is_mocked ()) { - g_debug ("Using mock for backlight."); - priv->available = TRUE; - priv->brightness_min = 0; - priv->brightness_max = 100; - - gsd_backlight_set_brightness_async (backlight, GSD_MOCK_DEFAULT_BRIGHTNESS, NULL, NULL, NULL); - - goto done; - } - #ifdef HAVE_GUDEV /* Try finding a udev device. */ if (gsd_backlight_udev_init (backlight)) diff --git a/plugins/power/meson.build b/plugins/power/meson.build index caeb8e47..0158a466 100644 --- a/plugins/power/meson.build +++ b/plugins/power/meson.build @@ -120,7 +120,8 @@ test_py = find_program('test.py') envs = [ # 'G_DEBUG=fatal_warnings', 'BUILDDIR=' + meson.current_build_dir(), - 'TOP_BUILDDIR=' + meson.build_root() + 'TOP_BUILDDIR=' + meson.build_root(), + 'LD_PRELOAD=libumockdev-preload.so.0', ] test( diff --git a/plugins/power/test-backlight-helper b/plugins/power/test-backlight-helper new file mode 100755 index 00000000..7aba9b76 --- /dev/null +++ b/plugins/power/test-backlight-helper @@ -0,0 +1,5 @@ +#!/bin/sh + +# Simulate a slow call and just write the given brightness value to the device +sleep 0.1 +echo "$2" >"$1/brightness" diff --git a/plugins/power/test.py b/plugins/power/test.py index 28addb28..f79218cd 100755 --- a/plugins/power/test.py +++ b/plugins/power/test.py @@ -27,10 +27,12 @@ import dbus import gi gi.require_version('UPowerGlib', '1.0') +gi.require_version('UMockdev', '1.0') from gi.repository import Gio from gi.repository import GLib from gi.repository import UPowerGlib +from gi.repository import UMockdev class PowerPluginTest(gsdtestcase.GSDTestCase): '''Test the power plugin''' @@ -43,6 +45,14 @@ class PowerPluginTest(gsdtestcase.GSDTestCase): self.start_logind() self.daemon_death_expected = False + + # Setup umockdev testbed + self.testbed = UMockdev.Testbed.new() + os.environ['UMOCKDEV_DIR'] = self.testbed.get_root_dir() + + # Create a mock backlight device + self.add_backlight() + # start mock upowerd (self.upowerd, self.obj_upower) = self.spawn_server_template( 'upower', {'DaemonVersion': '0.99', 'OnBattery': True, 'LidIsClosed': False}, stdout=subprocess.PIPE) @@ -96,11 +106,12 @@ class PowerPluginTest(gsdtestcase.GSDTestCase): self.plugin_log_write = open(os.path.join(self.workdir, 'plugin_power.log'), 'wb', buffering=0) # avoid painfully long delays of actions for tests env = os.environ.copy() - # Disable the use of the PolicyKit helper for brightness - env['GSD_DISABLE_BACKLIGHT_HELPER'] = '1' # Disable PulseAudio output from libcanberra env['CANBERRA_DRIVER'] = 'null' + # Use dummy script as testing backlight helper + env['GSD_BACKLIGHT_HELPER'] = os.path.join (project_root, 'plugins', 'power', 'test-backlight-helper') + self.daemon = subprocess.Popen( [os.path.join(builddir, 'gsd-power'), '--verbose'], # comment out this line if you want to see the logs in real time @@ -156,10 +167,7 @@ class PowerPluginTest(gsdtestcase.GSDTestCase): except OSError: pass - try: - os.unlink('GSD_MOCK_brightness') - except OSError: - pass + del self.testbed # we check this at the end so that the other cleanup always happens self.assertTrue(daemon_running or self.daemon_death_expected, 'daemon died during the test') @@ -198,12 +206,26 @@ class PowerPluginTest(gsdtestcase.GSDTestCase): def get_status(self): return self.obj_session_presence_props.Get('org.gnome.SessionManager.Presence', 'status') - def get_brightness(self): - try: - (success, ret) = GLib.file_get_contents ('GSD_MOCK_brightness') - except: - return gsdpowerconstants.GSD_MOCK_DEFAULT_BRIGHTNESS - return int(ret) + def add_backlight(self, _type="raw", brightness=50, max_brightness=100): + # Undo mangling done in GSD + if max_brightness >= 99: + max_brightness += 1 + brightness += 1 + + # This needs to be done before starting gsd-power! + self.backlight = self.testbed.add_device('backlight', 'mock_backlight', None, + ['type', _type, + 'max_brightness', str(max_brightness), + 'brightness', str(brightness)], + []) + + def get_brightness(self, max_brightness=100): + # self.backlight contains the leading slash, so os.path.join doesn't quite work + res = int(open(os.path.join(self.testbed.get_root_dir() + self.backlight, 'brightness')).read()) + # Undo mangling done in GSD + if max_brightness >= 99: + res -= 1 + return res def set_has_external_monitor(self, external): if external: |