From 2ef24490a3712ffca0faf86aecf56abcd43a1276 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 15 May 2018 10:16:14 +0200 Subject: [PATCH] tests: explicitly export/unexport objects Instead of exporting exported-objects during construction, export them right before we register them (for example, in case of device instances, before we add the device to the manager's device list). Likewise, when removing the object from the list, always explicitly unexport them. Without explicitly unexporting the objects, they can also not be removed, because object-manage and D-Bus library keep references to them. --- tools/test-networkmanager-service.py | 52 ++++++++++++++++------------ 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py index 39dc37f571..2121bb2b27 100755 --- a/tools/test-networkmanager-service.py +++ b/tools/test-networkmanager-service.py @@ -32,7 +32,7 @@ _DEFAULT_ARG = object() class Global: pass -gl = Global() +gl = None ############################################################################### @@ -297,7 +297,6 @@ class WiredDevice(Device): } self.dbus_interface_add(IFACE_WIRED, props, WiredDevice.PropertiesChanged) - self.export() @dbus.service.signal(IFACE_WIRED, signature='a{sv}') def PropertiesChanged(self, changed): @@ -322,7 +321,6 @@ class VlanDevice(Device): } self.dbus_interface_add(IFACE_VLAN, props, VlanDevice.PropertiesChanged) - self.export() @dbus.service.signal(IFACE_VLAN, signature='a{sv}') def PropertiesChanged(self, changed): @@ -381,7 +379,6 @@ class WifiAp(ExportedObj): } self.dbus_interface_add(IFACE_WIFI_AP, props, WifiAp.PropertiesChanged) - self.export() def __del__(self): if self.strength_id > 0: @@ -433,7 +430,6 @@ class WifiDevice(Device): } self.dbus_interface_add(IFACE_WIFI, props, WifiDevice.PropertiesChanged) - self.export() @dbus.service.method(dbus_interface=IFACE_WIFI, in_signature='', out_signature='ao') def GetAccessPoints(self): @@ -454,19 +450,21 @@ class WifiDevice(Device): pass def add_ap(self, ap): + ap.export() self.aps.append(ap) self._dbus_property_set(IFACE_WIFI, PRP_WIFI_ACCESS_POINTS, ExportedObj.to_path_array(self.aps)) self.AccessPointAdded(ExportedObj.to_path(ap)) return ap - @dbus.service.signal(IFACE_WIFI, signature='o') - def AccessPointRemoved(self, ap_path): - pass - def remove_ap(self, ap): self.aps.remove(ap) self._dbus_property_set(IFACE_WIFI, PRP_WIFI_ACCESS_POINTS, ExportedObj.to_path_array(self.aps)) self.AccessPointRemoved(ExportedObj.to_path(ap)) + ap.unexport() + + @dbus.service.signal(IFACE_WIFI, signature='o') + def AccessPointRemoved(self, ap_path): + pass @dbus.service.signal(IFACE_WIFI, signature='a{sv}') def PropertiesChanged(self, changed): @@ -506,7 +504,6 @@ class WimaxNsp(ExportedObj): } self.dbus_interface_add(IFACE_WIMAX_NSP, props, WimaxNsp.PropertiesChanged) - self.export() def __del__(self): if self.strength_id > 0: @@ -558,7 +555,6 @@ class WimaxDevice(Device): } self.dbus_interface_add(IFACE_WIMAX, props, WimaxDevice.PropertiesChanged) - self.export() @dbus.service.method(dbus_interface=IFACE_WIMAX, in_signature='', out_signature='ao') def GetNspList(self): @@ -569,18 +565,20 @@ class WimaxDevice(Device): pass def add_nsp(self, nsp): + nsp.export() self.nsps.append(nsp) self._dbus_property_set(IFACE_WIMAX, PRP_WIMAX_NSPS, ExportedObj.to_path_array(self.nsps)) self.NspAdded(ExportedObj.to_path(nsp)) - @dbus.service.signal(IFACE_WIMAX, signature='o') - def NspRemoved(self, nsp_path): - pass - def remove_nsp(self, nsp): self.nsps.remove(nsp) self._dbus_property_set(IFACE_WIMAX, PRP_WIMAX_NSPS, ExportedObj.to_path_array(self.nsps)) self.NspRemoved(ExportedObj.to_path(nsp)) + nsp.unexport() + + @dbus.service.signal(IFACE_WIMAX, signature='o') + def NspRemoved(self, nsp_path): + pass @dbus.service.signal(IFACE_WIMAX, signature='a{sv}') def PropertiesChanged(self, changed): @@ -914,21 +912,23 @@ class NetworkManager(ExportedObj): def add_device(self, device): if self.find_device_first(ident = device.ident, path = device.path) is not None: raise TestError("Duplicate device ident=%s / path=%s" % (device.ident, device.path)) + device.export() self.devices.append(device) self._dbus_property_set(IFACE_NM, PRP_NM_DEVICES, ExportedObj.to_path_array(self.devices)) self._dbus_property_set(IFACE_NM, PRP_NM_ALL_DEVICES, ExportedObj.to_path_array(self.devices)) self.DeviceAdded(ExportedObj.to_path(device)) return device - @dbus.service.signal(IFACE_NM, signature='o') - def DeviceRemoved(self, devpath): - pass - def remove_device(self, device): self.devices.remove(device) self._dbus_property_set(IFACE_NM, PRP_NM_DEVICES, ExportedObj.to_path_array(self.devices)) self._dbus_property_set(IFACE_NM, PRP_NM_ALL_DEVICES, ExportedObj.to_path_array(self.devices)) self.DeviceRemoved(ExportedObj.to_path(device)) + device.unexport() + + @dbus.service.signal(IFACE_NM, signature='o') + def DeviceRemoved(self, devpath): + pass @dbus.service.signal(IFACE_NM, signature='a{sv}') def PropertiesChanged(self, changed): @@ -1060,7 +1060,6 @@ class Connection(ExportedObj): } self.dbus_interface_add(IFACE_CONNECTION, props) - self.export() def get_id(self, settings=None): if settings is None: @@ -1200,13 +1199,14 @@ class Settings(ExportedObj): if uuid in [c.get_uuid() for c in self.connections.values()]: raise InvalidSettingException('cannot add duplicate connection with uuid %s' % (uuid)) + con.export() self.connections[con.path] = con self.NewConnection(con.path) self._dbus_property_set(IFACE_SETTINGS, PRP_SETTINGS_CONNECTIONS, dbus.Array(self.connections.keys(), 'o')) if self.remove_next_connection: self.remove_next_connection = False - self.connections[con.path].Delete() + self.delete_connection(con) return con.path @@ -1376,6 +1376,8 @@ def main(): random.seed() + global gl + gl = Global() gl.mainloop = GLib.MainLoop() gl.bus = dbus.SessionBus() @@ -1383,8 +1385,8 @@ def main(): gl.object_manager = ObjectManager('/org/freedesktop') gl.manager = NetworkManager() gl.settings = Settings() - gl.agent_manager = AgentManager() gl.dns_manager = DnsManager() + gl.agent_manager = AgentManager() if not gl.bus.request_name("org.freedesktop.NetworkManager"): raise AssertionError("Failure to request D-Bus name org.freedesktop.NetworkManager") @@ -1403,6 +1405,12 @@ def main(): GLib.source_remove(id1) GLib.source_remove(id2) + gl.agent_manager.remove_from_connection() + gl.dns_manager.unexport() + gl.settings.unexport() + gl.manager.unexport() + gl.object_manager.remove_from_connection() + sys.exit(0) if __name__ == '__main__':