tests: allow extensions to cleanup objects references

Extension objects are singletons and normally do not require any special
cleanup. But in case of tests, we try to remove all the qubes objects
between tests and the cache in usb extension makes it hard.
Add a 'qubes-close' event that extensions can handle to remove extra
references stored in extension objects themselves.
This commit is contained in:
Marek Marczykowski-Górecki 2020-01-09 01:42:46 +01:00
parent 35fa733a67
commit a89d3f0cae
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
2 changed files with 20 additions and 0 deletions

View File

@ -724,6 +724,17 @@ class Qubes(qubes.PropertyHolder):
:param event: Event name (``'pool-delete'``)
:param pool: Pool object
.. event:: qubes-close (subject, event)
Fired when this Qubes() object instance is going to be closed
and destroyed. In practice it is called only during tests, to
cleanup objects from one test, before another.
It is _not_ called when qubesd daemon is stopped.
:param subject: Event emitter
:param event: Event name (``'qubes-close'``)
Methods and attributes:
"""
default_guivm = qubes.VMProperty(
@ -1085,6 +1096,9 @@ class Qubes(qubes.PropertyHolder):
for frame in traceback.extract_stack():
self.log.debug('%s', frame)
# let all the extension cleanup things
self.fire_event('qubes-close')
super().close()
if self._domain_event_callback_id is not None:
@ -1094,6 +1108,9 @@ class Qubes(qubes.PropertyHolder):
# Only our Lord, The God Almighty, knows what references
# are kept in extensions.
# NOTE: this doesn't really delete extension objects - Extension class
# saves reference to instance, and also various registered (class level)
# event handlers do that too
del self._extensions
for vm in self.domains:

View File

@ -273,6 +273,9 @@ class QubesVMTestsMixin(object):
def tearDown(self):
try:
# self.app is not a real events emiter, so make the call manually
for handler in qubes.Qubes.__handlers__.get('qubes-close'):
handler(self.app, 'qubes-close')
self.app.domains.close()
except AttributeError:
pass