Skip to content

Commit 75691a8

Browse files
author
anon
committed
add utests and remove unnecessary cache check
1 parent dca9938 commit 75691a8

4 files changed

Lines changed: 66 additions & 12 deletions

File tree

qubesadmin/app.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,7 @@ def refresh_cache(self) -> None:
114114
props_dict = dict(vm_prop.split("=", 1)
115115
for vm_prop in props.split(" "))
116116
klass = typing.cast(Klass, props_dict["class"])
117-
power_state = (
118-
typing.cast(PowerState, props_dict.get("state"))
119-
if self.app.cache_enabled else None
120-
)
117+
power_state = typing.cast(PowerState, props_dict.get("state"))
121118
new_known_names.add(vm_name)
122119
existing_vm = self._vms.get(vm_name) or\
123120
vms_by_current_name.get(vm_name)

qubesadmin/tests/app.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,70 @@ def test_012_getitem_cached_object(self):
186186
self.assertIsNot(vm1, vm4)
187187
self.assertAllCalled()
188188

189+
def test_013_get_blind_not_in_membership(self):
190+
"""Blind objects must not appear in membership operations."""
191+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
192+
b'0\x00test-vm class=AppVM state=Running\n'
193+
self.assertIn('test-vm', self.app.domains)
194+
self.app.domains.get_blind('other-vm')
195+
self.assertNotIn('other-vm', self.app.domains)
196+
self.assertNotIn('other-vm', self.app.domains.keys())
197+
self.assertEqual([vm.name for vm in self.app.domains], ['test-vm'])
198+
self.assertAllCalled()
199+
200+
def test_014_refresh_cache_forces_reload(self):
201+
"""refresh_cache() must trigger a new admin.vm.List call even if
202+
already initialised."""
203+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
204+
b'0\x00test-vm class=AppVM state=Running\n'
205+
self.assertIn('test-vm', self.app.domains)
206+
self.assertNotIn('test-vm2', self.app.domains)
207+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
208+
b'0\x00test-vm2 class=AppVM state=Running\n'
209+
self.app.domains.refresh_cache()
210+
self.assertNotIn('test-vm', self.app.domains)
211+
self.assertIn('test-vm2', self.app.domains)
212+
self.assertAllCalled()
213+
214+
def test_015_delitem_targeted_cleanup(self):
215+
"""del domains[name] must remove the VM immediately without a
216+
further admin.vm.List call."""
217+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
218+
b'0\x00test-vm class=AppVM state=Running\n'
219+
self.app.expected_calls[('test-vm', 'admin.vm.Remove', None, None)] = \
220+
b'0\x00'
221+
self.assertIn('test-vm', self.app.domains)
222+
del self.app.domains['test-vm']
223+
self.assertNotIn('test-vm', self.app.domains)
224+
self.assertAllCalled()
225+
226+
def test_016_rename_preserves_identity(self):
227+
"""After a rename, refresh_cache() must return the same object
228+
under the new name."""
229+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
230+
b'0\x00test-vm class=AppVM state=Running\n'
231+
vm = self.app.domains['test-vm']
232+
vm._method_dest = 'new-name'
233+
self.app.domains.clear_cache()
234+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
235+
b'0\x00new-name class=AppVM state=Running\n'
236+
vm2 = self.app.domains['new-name']
237+
self.assertIs(vm, vm2)
238+
self.assertAllCalled()
239+
240+
def test_017_clear_cache_invalidate_name(self):
241+
"""clear_cache(invalidate_name) must drop that VM's object from the
242+
cache so a fresh one is created on next access."""
243+
self.app.expected_calls[('dom0', 'admin.vm.List', None, None)] = \
244+
b'0\x00test-vm class=AppVM state=Running\n'
245+
vm1 = self.app.domains['test-vm']
246+
self.app.domains.clear_cache()
247+
vm2 = self.app.domains['test-vm']
248+
self.assertIs(vm1, vm2)
249+
self.app.domains.clear_cache(invalidate_name = 'test-vm')
250+
vm3 = self.app.domains['test-vm']
251+
self.assertIsNot(vm1, vm3)
252+
self.assertAllCalled()
189253

190254

191255
class TC_10_QubesBase(qubesadmin.tests.QubesTestCase):

qubesadmin/tests/tools/qvm_ls.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,17 +380,10 @@ def test_101_list_selected(self):
380380
b'0\x00vm1 class=AppVM state=Running\n' \
381381
b'template1 class=TemplateVM state=Halted\n' \
382382
b'sys-net class=AppVM state=Running\n'
383-
self.app.expected_calls[
384-
('vm1', 'admin.vm.CurrentState', None, None)] = \
385-
b'0\x00power_state=Running'
386-
self.app.expected_calls[
387-
('sys-net', 'admin.vm.CurrentState', None, None)] = \
388-
b'0\x00power_state=Running'
389383
props = {
390384
'label': 'type=label green',
391385
'template': 'type=vm template1',
392386
'netvm': 'type=vm sys-net',
393-
# 'virt_mode': b'type=str pv',
394387
}
395388
self.app.expected_calls[
396389
('vm1', 'admin.vm.property.GetAll', None, None)] = \

qubesadmin/vm/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ def get_power_state(self):
208208
209209
"""
210210

211-
if self._power_state_cache is not None:
211+
if self._power_state_cache is not None and self.app.cache_enabled:
212212
return self._power_state_cache
213213
try:
214214
power_state = self._get_current_state()["power_state"]

0 commit comments

Comments
 (0)