@@ -330,6 +330,7 @@ def test_100_run(self):
330330 self .assertEqual (len (getattr (obj , m ).mock_calls ), 1 )
331331 self .assertEqual (obj .dispvm .mock_calls , [
332332 call .start (),
333+ call .run ('command -v qvm-backup-restore' ),
333334 call .run_service_for_stdio ('qubes.WaitForSession' ),
334335 call .tags .add ('backup-restore-mgmt' ),
335336 call .run_with_args ('terminal' , 'qvm-backup-restore' , 'args' ,
@@ -368,6 +369,7 @@ def test_101_run_pass_file(self):
368369 self .assertEqual (len (getattr (obj , m ).mock_calls ), 1 )
369370 self .assertEqual (obj .dispvm .mock_calls , [
370371 call .start (),
372+ call .run ('command -v qvm-backup-restore' ),
371373 call .run_service_for_stdio ('qubes.WaitForSession' ),
372374 call .tags .add ('backup-restore-mgmt' ),
373375 call .run_with_args ('terminal' , 'qvm-backup-restore' , 'args' ,
@@ -405,6 +407,7 @@ def test_102_run_error(self):
405407 self .assertEqual (len (getattr (obj , m ).mock_calls ), 1 )
406408 self .assertEqual (obj .dispvm .mock_calls , [
407409 call .start (),
410+ call .run ('command -v qvm-backup-restore' ),
408411 call .run_service_for_stdio ('qubes.WaitForSession' ),
409412 call .tags .add ('backup-restore-mgmt' ),
410413 call .run_with_args ('terminal' , 'qvm-backup-restore' , 'args' ,
@@ -414,3 +417,39 @@ def test_102_run_error(self):
414417 call .kill ()
415418 ])
416419 obj .transfer_pass_file .assert_not_called ()
420+
421+ def test_103_missing_package (self ):
422+ self .app .expected_calls [('dom0' , 'admin.vm.List' , None , None )] = (
423+ b'0\0 dom0 class=AdminVM state=Running\n '
424+ b'fedora-25 class=TemplateVM state=Halted\n '
425+ )
426+ args = unittest .mock .Mock (backup_location = '/backup/path' ,
427+ pass_file = None ,
428+ appvm = None )
429+ obj = RestoreInDisposableVM (self .app , args )
430+ methods = ['create_dispvm' , 'clear_old_tags' , 'register_backup_source' ,
431+ 'finalize_tags' ]
432+ for m in methods :
433+ setattr (obj , m , unittest .mock .Mock ())
434+ obj .transfer_pass_file = unittest .mock .Mock ()
435+ obj .dispvm = unittest .mock .Mock ()
436+ obj .dispvm .run = unittest .mock .Mock ()
437+ obj .dispvm .run .side_effect = subprocess .CalledProcessError (
438+ '1' ,
439+ 'command -v qvm-backup-restore' ,
440+ )
441+ with tempfile .NamedTemporaryFile () as tmp :
442+ with unittest .mock .patch ('qubesadmin.backup.dispvm.LOCKFILE' ,
443+ tmp .name ):
444+ with self .assertRaises (qubesadmin .exc .QubesException ):
445+ obj .run ()
446+ # pylint: disable=no-member
447+ for m in methods :
448+ self .assertEqual (len (getattr (obj , m ).mock_calls ), 1 )
449+ self .assertEqual (obj .dispvm .mock_calls , [
450+ call .start (),
451+ call .run ('command -v qvm-backup-restore' ),
452+ call .tags .discard ('backup-restore-mgmt' ),
453+ call .kill ()
454+ ])
455+ obj .transfer_pass_file .assert_not_called ()
0 commit comments