@@ -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\x00 test-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\x00 test-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\x00 test-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\x00 test-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\x00 test-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\x00 new-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\x00 test-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
191255class TC_10_QubesBase (qubesadmin .tests .QubesTestCase ):
0 commit comments