Skip to content

Commit 655125b

Browse files
agxmartinpitt
authored andcommitted
Add gsd-rfkill mock
This can be useful to test behavior of dependent components like desktop shells. Single properties can be toggled via ``` gdbus call --session -d org.gnome.SettingsDaemon.Rfkill -o /org/gnome/SettingsDaemon/Rfkill -m org.freedesktop.DBus.Properties.Set 'org.gnome.SettingsDaemon.Rfkill' 'BluetoothHasAirplaneMode' "<true>" ``` and airplane mode for all wwan/bt/wifi at once: ``` gdbus call --session -d org.gnome.SettingsDaemon.Rfkill -o /org/gnome/SettingsDaemon/Rfkill -m org.freedesktop.DBus.Mock.SetAirplaneMode true ``` Signed-off-by: Guido Günther <[email protected]>
1 parent 762065e commit 655125b

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

dbusmock/templates/gsd_rfkill.py

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""gsd-rfkill mock template
2+
3+
This creates the expected properties of the GNOME Settings Daemon's
4+
rfkill object. You can specify any property such as AirplaneMode in
5+
"parameters".
6+
"""
7+
8+
# This program is free software; you can redistribute it and/or modify it under
9+
# the terms of the GNU Lesser General Public License as published by the Free
10+
# Software Foundation; either version 3 of the License, or (at your option) any
11+
# later version. See http://www.gnu.org/copyleft/lgpl.html for the full text
12+
# of the license.
13+
14+
__author__ = "Guido Günther"
15+
__copyright__ = "2024 The Phosh Developers"
16+
17+
import dbus
18+
19+
from dbusmock import MOCK_IFACE
20+
21+
SYSTEM_BUS = False
22+
BUS_NAME = "org.gnome.SettingsDaemon.Rfkill"
23+
MAIN_OBJ = "/org/gnome/SettingsDaemon/Rfkill"
24+
MAIN_IFACE = "org.gnome.SettingsDaemon.Rfkill"
25+
26+
27+
def load(mock, parameters):
28+
props = dbus.Dictionary(
29+
{
30+
"AirplaneMode": parameters.get("AirplaneMode", False),
31+
"BluetoothAirplaneMode": parameters.get("BluetoothAirplaneMode", False),
32+
"BluetoothHardwareAirplaneMode": parameters.get("BluetoothHardwareAirplaneMode", False),
33+
"BluetoothHasAirplaneMode": parameters.get("BluetoothHasAirplanemode", True),
34+
"HardwareAirplaneMode": parameters.get("HardwareAirplaneMode", False),
35+
"HasAirplaneMode": parameters.get("HasAirplaneMode", True),
36+
"ShouldShowAirplaneMode": parameters.get("ShouldShowAirplaneMode", True),
37+
"WwanAirplaneMode": parameters.get("WwanAirplaneMode", False),
38+
"WwanHardwareAirplaneMode": parameters.get("WwanHardwareAirplaneMode", False),
39+
"WwanHasAirplaneMode": parameters.get("WwanHasAirplaneMode", True),
40+
},
41+
signature="sv",
42+
)
43+
mock.AddProperties(MAIN_IFACE, props)
44+
45+
46+
@dbus.service.method(MOCK_IFACE, in_signature="b", out_signature="b")
47+
def SetAirplaneMode(self, mode):
48+
"""
49+
Convenience method to toggle airplane mode
50+
"""
51+
self.props[MAIN_IFACE]["AirplaneMode"] = mode
52+
self.props[MAIN_IFACE]["BluetoothAirplaneMode"] = mode
53+
self.props[MAIN_IFACE]["WwanAirplaneMode"] = mode
54+
return mode

tests/test_gsd_rfkill.py

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# This program is free software; you can redistribute it and/or modify it under
2+
# the terms of the GNU Lesser General Public License as published by the Free
3+
# Software Foundation; either version 3 of the License, or (at your option) any
4+
# later version. See http://www.gnu.org/copyleft/lgpl.html for the full text
5+
# of the license.
6+
7+
__author__ = "Guido Günther"
8+
__copyright__ = "2024 The Phosh Developers"
9+
10+
import fcntl
11+
import os
12+
import subprocess
13+
import sys
14+
import unittest
15+
16+
import dbus
17+
18+
import dbusmock
19+
20+
21+
class TestGsdRfkill(dbusmock.DBusTestCase):
22+
"""Test mocked GNOME Settings Daemon Rfkill"""
23+
24+
@classmethod
25+
def setUpClass(cls):
26+
cls.start_session_bus()
27+
cls.dbus_con = cls.get_dbus()
28+
29+
def setUp(self):
30+
(self.p_mock, self.p_obj) = self.spawn_server_template("gsd_rfkill", {}, stdout=subprocess.PIPE)
31+
# set log to nonblocking
32+
flags = fcntl.fcntl(self.p_mock.stdout, fcntl.F_GETFL)
33+
fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
34+
35+
def tearDown(self):
36+
self.p_mock.stdout.close()
37+
self.p_mock.terminate()
38+
self.p_mock.wait()
39+
40+
def test_mainobject(self):
41+
propiface = dbus.Interface(self.p_obj, dbus.PROPERTIES_IFACE)
42+
43+
mode = propiface.Get("org.gnome.SettingsDaemon.Rfkill", "AirplaneMode")
44+
self.assertEqual(mode, False)
45+
mode = propiface.Get("org.gnome.SettingsDaemon.Rfkill", "HasAirplaneMode")
46+
self.assertEqual(mode, True)
47+
48+
def test_airplane_mode(self):
49+
propiface = dbus.Interface(self.p_obj, dbus.PROPERTIES_IFACE)
50+
51+
self.p_obj.SetAirplaneMode(True)
52+
53+
mode = propiface.Get("org.gnome.SettingsDaemon.Rfkill", "AirplaneMode")
54+
self.assertEqual(mode, True)
55+
mode = propiface.Get("org.gnome.SettingsDaemon.Rfkill", "BluetoothAirplaneMode")
56+
self.assertEqual(mode, True)
57+
mode = propiface.Get("org.gnome.SettingsDaemon.Rfkill", "WwanAirplaneMode")
58+
self.assertEqual(mode, True)
59+
60+
61+
if __name__ == "__main__":
62+
# avoid writing to stderr
63+
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout))

0 commit comments

Comments
 (0)