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.
This commit is contained in:
Thomas Haller 2018-05-15 10:16:14 +02:00
parent 39118a1f42
commit 2ef24490a3

View file

@ -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__':