From 236abac6fb5f46d1280d73d9ce89ff0948b18aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 7 Feb 2025 00:32:55 +0100 Subject: [PATCH 1/3] gio/powerprofilemonitordbus: Use newer DBus API Since some time the power-profiles-daemon project has been moved under the upower umbrella and renamed its API to follow that. While the legacy name is still supported, there are plans to not support it anymore in future [2]. So let's update GLib code to use the current main name instead. [1] https://gitlab.freedesktop.org/upower/power-profiles-daemon/-/merge_requests/148 [2] https://gitlab.freedesktop.org/upower/power-profiles-daemon/-/merge_requests/166 --- docs/reference/gio/overview.md | 4 ++-- gio/gpowerprofilemonitordbus.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/reference/gio/overview.md b/docs/reference/gio/overview.md index 89859f490..f8c03863a 100644 --- a/docs/reference/gio/overview.md +++ b/docs/reference/gio/overview.md @@ -445,5 +445,5 @@ The following extension points are currently defined by GIO: implementations for power usage monitoring. Implementations of this extension point must implement the [iface@Gio.PowerProfileMonitor] interface. GIO contains implementations of this extension point that use the - `net.hadess.PowerProfiles` D-Bus interface and the desktop portal for - this functionality. + `org.freedesktop.UPower.PowerProfiles` D-Bus interface and the desktop portal + for this functionality. diff --git a/gio/gpowerprofilemonitordbus.c b/gio/gpowerprofilemonitordbus.c index ac6f8a88c..7357d9e57 100644 --- a/gio/gpowerprofilemonitordbus.c +++ b/gio/gpowerprofilemonitordbus.c @@ -54,9 +54,9 @@ typedef enum PROP_POWER_SAVER_ENABLED = 1, } GPowerProfileMonitorDBusProperty; -#define POWERPROFILES_DBUS_NAME "net.hadess.PowerProfiles" -#define POWERPROFILES_DBUS_IFACE "net.hadess.PowerProfiles" -#define POWERPROFILES_DBUS_PATH "/net/hadess/PowerProfiles" +#define POWERPROFILES_DBUS_NAME "org.freedesktop.UPower.PowerProfiles" +#define POWERPROFILES_DBUS_IFACE "org.freedesktop.UPower.PowerProfiles" +#define POWERPROFILES_DBUS_PATH "/org/freedesktop/UPower/PowerProfiles" G_DEFINE_TYPE_WITH_CODE (GPowerProfileMonitorDBus, g_power_profile_monitor_dbus, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, From 71d08b707adb82e8eaab8a26f431ce78c1a4c06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 7 Feb 2025 00:42:14 +0100 Subject: [PATCH 2/3] gio/tests/power-profile-monitor-*.py: Fix style using black --- gio/tests/power-profile-monitor-dbus.py.in | 77 +++++++++++----- gio/tests/power-profile-monitor-portal.py.in | 96 ++++++++++++++------ 2 files changed, 119 insertions(+), 54 deletions(-) diff --git a/gio/tests/power-profile-monitor-dbus.py.in b/gio/tests/power-profile-monitor-dbus.py.in index f955afc80..4aca11704 100755 --- a/gio/tests/power-profile-monitor-dbus.py.in +++ b/gio/tests/power-profile-monitor-dbus.py.in @@ -6,10 +6,10 @@ # later version. See http://www.gnu.org/copyleft/lgpl.html for the full text # of the license. -__author__ = 'Bastien Nocera' -__email__ = 'hadess@hadess.net' -__copyright__ = '(c) 2019, 2021 Red Hat Inc.' -__license__ = 'LGPL 3+' +__author__ = "Bastien Nocera" +__email__ = "hadess@hadess.net" +__copyright__ = "(c) 2019, 2021 Red Hat Inc." +__license__ = "LGPL 3+" import unittest import sys @@ -31,7 +31,7 @@ try: dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) class TestPowerProfileMonitor(dbusmock.DBusTestCase): - '''Test GPowerProfileMonitorDBus''' + """Test GPowerProfileMonitorDBus""" @classmethod def setUpClass(klass): @@ -42,23 +42,30 @@ try: try: Gio.PowerProfileMonitor except AttributeError: - raise unittest.SkipTest('Power Profile Monitor not in ' - 'introspection data. Requires ' - 'GObject-Introspection ≥ 1.63.2') # FIXME version + raise unittest.SkipTest( + "Power Profile Monitor not in " + "introspection data. Requires " + "GObject-Introspection ≥ 1.63.2" + ) # FIXME version try: (self.p_mock, self.obj_ppd) = self.spawn_server_template( - 'power_profiles_daemon', {}, stdout=subprocess.PIPE) + "power_profiles_daemon", {}, stdout=subprocess.PIPE + ) except ModuleNotFoundError: - raise unittest.SkipTest("power-profiles-daemon dbusmock template not " - "found. Requires dbusmock > 0.23.1.") # FIXME version + raise unittest.SkipTest( + "power-profiles-daemon dbusmock template not " + "found. Requires dbusmock > 0.23.1." + ) # FIXME version # set log to nonblocking flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL) fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK) self.power_saver_enabled = False self.dbus_props = dbus.Interface(self.obj_ppd, dbus.PROPERTIES_IFACE) self.power_profile_monitor = Gio.PowerProfileMonitor.dup_default() - assert("GPowerProfileMonitorDBus" in str(self.power_profile_monitor)) - self.power_profile_monitor.connect("notify::power-saver-enabled", self.power_saver_enabled_cb) + assert "GPowerProfileMonitorDBus" in str(self.power_profile_monitor) + self.power_profile_monitor.connect( + "notify::power-saver-enabled", self.power_saver_enabled_cb + ) self.mainloop = GLib.MainLoop() self.main_context = self.mainloop.get_context() @@ -67,13 +74,13 @@ try: self.p_mock.wait() def assertEventually(self, condition, message=None, timeout=5): - '''Assert that condition function eventually returns True. + """Assert that condition function eventually returns True. Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. - ''' + """ if not message: - message = 'timed out waiting for ' + str(condition) + message = "timed out waiting for " + str(condition) def timed_out_cb(message): self.fail(message) @@ -89,24 +96,46 @@ try: timeout_source.destroy() def power_saver_enabled_cb(self, spec, data): - self.power_saver_enabled = self.power_profile_monitor.get_power_saver_enabled() + self.power_saver_enabled = ( + self.power_profile_monitor.get_power_saver_enabled() + ) self.main_context.wakeup() def test_power_profile_power_saver_enabled(self): - '''power-saver-enabled property''' + """power-saver-enabled property""" - self.assertEqual(self.power_profile_monitor.get_power_saver_enabled(), False) - self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('power-saver', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 1) + self.assertEqual( + self.power_profile_monitor.get_power_saver_enabled(), False + ) + self.dbus_props.Set( + "net.hadess.PowerProfiles", + "ActiveProfile", + dbus.String("power-saver", variant_level=1), + ) + self.assertEventually( + lambda: self.power_saver_enabled == True, + "power-saver didn't become enabled", + 1, + ) - self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('balanced', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 1) + self.dbus_props.Set( + "net.hadess.PowerProfiles", + "ActiveProfile", + dbus.String("balanced", variant_level=1), + ) + self.assertEventually( + lambda: self.power_saver_enabled == False, + "power-saver didn't become disabled", + 1, + ) except ImportError as e: + @unittest.skip("Cannot import %s" % e.name) class TestPowerProfileMonitor(unittest.TestCase): def test_power_profile_power_saver_enabled(self): pass -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main(testRunner=taptestrunner.TAPTestRunner()) diff --git a/gio/tests/power-profile-monitor-portal.py.in b/gio/tests/power-profile-monitor-portal.py.in index 3bb0baf3c..0c521f7af 100755 --- a/gio/tests/power-profile-monitor-portal.py.in +++ b/gio/tests/power-profile-monitor-portal.py.in @@ -6,10 +6,10 @@ # later version. See http://www.gnu.org/copyleft/lgpl.html for the full text # of the license. -__author__ = 'Bastien Nocera' -__email__ = 'hadess@hadess.net' -__copyright__ = '(c) 2021 Red Hat Inc.' -__license__ = 'LGPL 3+' +__author__ = "Bastien Nocera" +__email__ = "hadess@hadess.net" +__copyright__ = "(c) 2021 Red Hat Inc." +__license__ = "LGPL 3+" import unittest import sys @@ -35,7 +35,7 @@ try: XDG_DESKTOP_PORTAL_PATH = "@libexecdir@/xdg-desktop-portal" class TestPowerProfileMonitorPortal(dbusmock.DBusTestCase): - '''Test GPowerProfileMonitorPortal''' + """Test GPowerProfileMonitorPortal""" @classmethod def setUpClass(klass): @@ -48,15 +48,20 @@ try: try: Gio.PowerProfileMonitor except AttributeError: - raise unittest.SkipTest('Power Profile Monitor not in ' - 'introspection data. Requires ' - 'GObject-Introspection > 1.69.0') + raise unittest.SkipTest( + "Power Profile Monitor not in " + "introspection data. Requires " + "GObject-Introspection > 1.69.0" + ) try: (self.p_mock, self.obj_ppd) = self.spawn_server_template( - 'power_profiles_daemon', {}, stdout=subprocess.PIPE) + "power_profiles_daemon", {}, stdout=subprocess.PIPE + ) except ModuleNotFoundError: - raise unittest.SkipTest("power-profiles-daemon dbusmock template not " - "found. Requires dbusmock > 0.23.1.") + raise unittest.SkipTest( + "power-profiles-daemon dbusmock template not " + "found. Requires dbusmock > 0.23.1." + ) # set log to nonblocking flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL) fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK) @@ -70,18 +75,21 @@ try: raise unittest.SkipTest("xdg-desktop-portal not available") try: - self.wait_for_bus_object('org.freedesktop.portal.Desktop', - '/org/freedesktop/portal/desktop') + self.wait_for_bus_object( + "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop" + ) except: self.p_mock.terminate() self.p_mock.wait() raise # subprocess.Popen(['gdbus', 'monitor', '--session', '--dest', 'org.freedesktop.portal.Desktop']) - os.environ['GIO_USE_PORTALS'] = "1" + os.environ["GIO_USE_PORTALS"] = "1" self.power_profile_monitor = Gio.PowerProfileMonitor.dup_default() - assert("GPowerProfileMonitorPortal" in str(self.power_profile_monitor)) - self.power_profile_monitor.connect("notify::power-saver-enabled", self.power_saver_enabled_cb) + assert "GPowerProfileMonitorPortal" in str(self.power_profile_monitor) + self.power_profile_monitor.connect( + "notify::power-saver-enabled", self.power_saver_enabled_cb + ) self.mainloop = GLib.MainLoop() self.main_context = self.mainloop.get_context() @@ -90,13 +98,13 @@ try: self.p_mock.wait() def assertEventually(self, condition, message=None, timeout=5): - '''Assert that condition function eventually returns True. + """Assert that condition function eventually returns True. Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. - ''' + """ if not message: - message = 'timed out waiting for ' + str(condition) + message = "timed out waiting for " + str(condition) def timed_out_cb(message): self.fail(message) @@ -112,35 +120,63 @@ try: timeout_source.destroy() def power_saver_enabled_cb(self, spec, data): - self.power_saver_enabled = self.power_profile_monitor.get_power_saver_enabled() + self.power_saver_enabled = ( + self.power_profile_monitor.get_power_saver_enabled() + ) self.main_context.wakeup() def test_power_profile_power_saver_enabled_portal(self): - '''power-saver-enabled property''' + """power-saver-enabled property""" - self.assertEqual(self.power_profile_monitor.get_power_saver_enabled(), False) - self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('power-saver', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 1) + self.assertEqual( + self.power_profile_monitor.get_power_saver_enabled(), False + ) + self.dbus_props.Set( + "net.hadess.PowerProfiles", + "ActiveProfile", + dbus.String("power-saver", variant_level=1), + ) + self.assertEventually( + lambda: self.power_saver_enabled == True, + "power-saver didn't become enabled", + 1, + ) - self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('balanced', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 1) + self.dbus_props.Set( + "net.hadess.PowerProfiles", + "ActiveProfile", + dbus.String("balanced", variant_level=1), + ) + self.assertEventually( + lambda: self.power_saver_enabled == False, + "power-saver didn't become disabled", + 1, + ) def test_power_profile_power_saver_enabled_portal_default(self): - '''power-saver-enabled property default value''' + """power-saver-enabled property default value""" - self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('power-saver', variant_level=1)) + self.dbus_props.Set( + "net.hadess.PowerProfiles", + "ActiveProfile", + dbus.String("power-saver", variant_level=1), + ) # Create a new power profile monitor and check its property value is # correct by default. - new_power_profile_monitor = GObject.new(GObject.type_from_name('GPowerProfileMonitorPortal')) + new_power_profile_monitor = GObject.new( + GObject.type_from_name("GPowerProfileMonitorPortal") + ) new_power_profile_monitor.init() self.assertTrue(new_power_profile_monitor.get_power_saver_enabled()) except ImportError as e: + @unittest.skip("Cannot import %s" % e.name) class TestPowerProfileMonitorPortal(unittest.TestCase): def test_power_profile_power_saver_enabled_portal(self): pass -if __name__ == '__main__': + +if __name__ == "__main__": unittest.main(testRunner=taptestrunner.TAPTestRunner()) From dba2d618d5ac6c88419eba89c46dadfd22098b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 7 Feb 2025 00:47:34 +0100 Subject: [PATCH 3/3] gio/tests/power-profile-monitor*.py: Use upower ppd daemon APIs --- gio/tests/power-profile-monitor-dbus.py.in | 8 ++++---- gio/tests/power-profile-monitor-portal.py.in | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gio/tests/power-profile-monitor-dbus.py.in b/gio/tests/power-profile-monitor-dbus.py.in index 4aca11704..68b5692b9 100755 --- a/gio/tests/power-profile-monitor-dbus.py.in +++ b/gio/tests/power-profile-monitor-dbus.py.in @@ -49,12 +49,12 @@ try: ) # FIXME version try: (self.p_mock, self.obj_ppd) = self.spawn_server_template( - "power_profiles_daemon", {}, stdout=subprocess.PIPE + "upower_power_profiles_daemon", {}, stdout=subprocess.PIPE ) except ModuleNotFoundError: raise unittest.SkipTest( "power-profiles-daemon dbusmock template not " - "found. Requires dbusmock > 0.23.1." + "found. Requires dbusmock > 0.31.1." ) # FIXME version # set log to nonblocking flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL) @@ -108,7 +108,7 @@ try: self.power_profile_monitor.get_power_saver_enabled(), False ) self.dbus_props.Set( - "net.hadess.PowerProfiles", + "org.freedesktop.UPower.PowerProfiles", "ActiveProfile", dbus.String("power-saver", variant_level=1), ) @@ -119,7 +119,7 @@ try: ) self.dbus_props.Set( - "net.hadess.PowerProfiles", + "org.freedesktop.UPower.PowerProfiles", "ActiveProfile", dbus.String("balanced", variant_level=1), ) diff --git a/gio/tests/power-profile-monitor-portal.py.in b/gio/tests/power-profile-monitor-portal.py.in index 0c521f7af..a54253c28 100755 --- a/gio/tests/power-profile-monitor-portal.py.in +++ b/gio/tests/power-profile-monitor-portal.py.in @@ -55,12 +55,12 @@ try: ) try: (self.p_mock, self.obj_ppd) = self.spawn_server_template( - "power_profiles_daemon", {}, stdout=subprocess.PIPE + "upower_power_profiles_daemon", {}, stdout=subprocess.PIPE ) except ModuleNotFoundError: raise unittest.SkipTest( "power-profiles-daemon dbusmock template not " - "found. Requires dbusmock > 0.23.1." + "found. Requires dbusmock > 0.31.1." ) # set log to nonblocking flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL) @@ -132,7 +132,7 @@ try: self.power_profile_monitor.get_power_saver_enabled(), False ) self.dbus_props.Set( - "net.hadess.PowerProfiles", + "org.freedesktop.UPower.PowerProfiles", "ActiveProfile", dbus.String("power-saver", variant_level=1), ) @@ -143,7 +143,7 @@ try: ) self.dbus_props.Set( - "net.hadess.PowerProfiles", + "org.freedesktop.UPower.PowerProfiles", "ActiveProfile", dbus.String("balanced", variant_level=1), ) @@ -157,7 +157,7 @@ try: """power-saver-enabled property default value""" self.dbus_props.Set( - "net.hadess.PowerProfiles", + "org.freedesktop.UPower.PowerProfiles", "ActiveProfile", dbus.String("power-saver", variant_level=1), )