Skip to content

Commit 46c9866

Browse files
committed
appmenus: avoid duplicate dispvm menu updates
1 parent 9f601d8 commit 46c9866

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

qubesappmenus/tests.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import importlib.resources
3535
import qubesappmenus
3636
import qubesappmenus.receive
37+
import qubesappmenusext
3738

3839
class Label(object):
3940
def __init__(self, index, color, name):
@@ -48,6 +49,12 @@ class TestApp(object):
4849
def __init__(self):
4950
self.domains = {}
5051

52+
class TestVMM(object):
53+
offline_mode = False
54+
55+
class TestAppmenusExtApp(object):
56+
vmm = TestVMM()
57+
5158
class TestFeatures(dict):
5259

5360
def __init__(self, vm, **kwargs) -> None:
@@ -95,6 +102,18 @@ def icon(self):
95102
return 'servicevm-' + raw_icon_name
96103
return 'appvm-' + raw_icon_name
97104

105+
class TestAppmenusExtVM(object):
106+
# pylint: disable=too-few-public-methods
107+
app = TestAppmenusExtApp()
108+
109+
def __init__(self, template_for_dispvms=False,
110+
appmenus_dispvm=False):
111+
self.name = 'test-ext-vm'
112+
self.template_for_dispvms = template_for_dispvms
113+
self.features = TestFeatures(self)
114+
if appmenus_dispvm:
115+
self.features['appmenus-dispvm'] = '1'
116+
98117
VMPREFIX = 'test-'
99118

100119
class TC_00_Appmenus(unittest.TestCase):
@@ -146,6 +165,59 @@ def assertPathNotExists(self, path):
146165
if os.path.exists(path):
147166
self.fail("Path {} exists while it should not".format(path))
148167

168+
def assertUpdateScheduled(self, callback, should_schedule):
169+
ext = qubesappmenusext.AppmenusExtension()
170+
ext.collect_done_tasks = unittest.mock.Mock()
171+
ext.update_appmenus = unittest.mock.Mock(return_value='update-task')
172+
with unittest.mock.patch('asyncio.ensure_future') as ensure_future:
173+
callback(ext)
174+
if should_schedule:
175+
ext.collect_done_tasks.assert_called_once()
176+
ext.update_appmenus.assert_called_once()
177+
ensure_future.assert_called_once_with('update-task')
178+
else:
179+
ext.collect_done_tasks.assert_not_called()
180+
ext.update_appmenus.assert_not_called()
181+
ensure_future.assert_not_called()
182+
183+
def test_000_appmenus_ext_template_for_dispvms_needs_feature(self):
184+
vm = TestAppmenusExtVM(
185+
template_for_dispvms=True,
186+
appmenus_dispvm=False)
187+
188+
self.assertUpdateScheduled(
189+
lambda ext: ext.template_for_dispvms_setter(vm, None),
190+
False)
191+
192+
vm.features['appmenus-dispvm'] = '1'
193+
self.assertUpdateScheduled(
194+
lambda ext: ext.template_for_dispvms_setter(vm, None),
195+
True)
196+
197+
def test_000_appmenus_ext_dispvm_feature_needs_property(self):
198+
vm = TestAppmenusExtVM(
199+
template_for_dispvms=False,
200+
appmenus_dispvm=True)
201+
202+
self.assertUpdateScheduled(
203+
lambda ext: ext.on_feature_set_appmenus_dispvm(
204+
vm, None, 'appmenus-dispvm', '1'),
205+
False)
206+
self.assertUpdateScheduled(
207+
lambda ext: ext.on_feature_del_appmenus_dispvm(
208+
vm, None, 'appmenus-dispvm'),
209+
False)
210+
211+
vm.template_for_dispvms = True
212+
self.assertUpdateScheduled(
213+
lambda ext: ext.on_feature_set_appmenus_dispvm(
214+
vm, None, 'appmenus-dispvm', '1'),
215+
True)
216+
self.assertUpdateScheduled(
217+
lambda ext: ext.on_feature_del_appmenus_dispvm(
218+
vm, None, 'appmenus-dispvm'),
219+
True)
220+
149221

150222
def test_000_templates_dirs(self):
151223
self.assertEqual(

qubesappmenusext/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ def provides_network_setter(self, vm, event, **kwargs):
175175
def template_for_dispvms_setter(self, vm, event, **kwargs):
176176
if vm.app.vmm.offline_mode:
177177
return
178+
if not vm.features.get('appmenus-dispvm', False):
179+
return
178180
self.collect_done_tasks(vm)
179181
self.vm_tasks[vm.name].append(
180182
asyncio.ensure_future(self.update_appmenus(vm)))
@@ -194,6 +196,8 @@ def provides_network_setter(self, vm, event, name, newvalue, oldvalue=None):
194196
def on_feature_del_appmenus_dispvm(self, vm, event, feature):
195197
if vm.app.vmm.offline_mode:
196198
return
199+
if not getattr(vm, 'template_for_dispvms', False):
200+
return
197201
self.collect_done_tasks(vm)
198202
self.vm_tasks[vm.name].append(
199203
asyncio.ensure_future(self.update_appmenus(vm)))
@@ -203,6 +207,8 @@ def on_feature_set_appmenus_dispvm(self, vm, event, feature,
203207
value, oldvalue=None):
204208
if vm.app.vmm.offline_mode:
205209
return
210+
if not getattr(vm, 'template_for_dispvms', False):
211+
return
206212
self.collect_done_tasks(vm)
207213
self.vm_tasks[vm.name].append(
208214
asyncio.ensure_future(self.update_appmenus(vm)))

0 commit comments

Comments
 (0)