26
26
27
27
from PyQt6 import QtCore , QtWidgets
28
28
import qubesmanager .settings as vm_settings
29
+ import qubesmanager .utils as utils
30
+ import qubesadmin .utils as admin_utils
29
31
from qubesadmin .tests .mock_app import MockQube , MockDevice
30
32
31
33
PAGES = ["basic" , "advanced" , "firewall" , "devices" , "applications" , "services" ]
38
40
"test-standalone" ,
39
41
"test-old" ,
40
42
"test-vm-set" ,
43
+ "default-dvm" ,
44
+ "test-disp" ,
45
+ "test-alt-dvm" ,
46
+ "test-alt-disp" ,
41
47
]
42
48
43
49
# with a template
@@ -372,7 +378,9 @@ def test_101_change_template(settings_fixture):
372
378
settings_window , page , vm_name = settings_fixture
373
379
vm = settings_window .qubesapp .domains [vm_name ]
374
380
375
- if vm .is_running () or not hasattr (vm , "template" ):
381
+ if vm .klass == "DispVM" :
382
+ return
383
+ if vm .is_running () or not hasattr (vm , "template" ) or vm .klass == "StandaloneVM" :
376
384
assert not settings_window .template_name .isEnabled ()
377
385
return
378
386
@@ -609,7 +617,9 @@ def test_108_disk_space(settings_fixture):
609
617
@mock .patch ("qubesmanager.settings.RenameVMThread" )
610
618
@mock .patch ("PyQt6.QtWidgets.QMessageBox.warning" )
611
619
@pytest .mark .parametrize (
612
- "settings_fixture" , ["fedora-36" , "test-vm-set" , "test-blue" ], indirect = True
620
+ "settings_fixture" ,
621
+ ["fedora-36" , "test-vm-set" , "test-blue" , "default-dvm" , "test-disp" ],
622
+ indirect = True ,
613
623
)
614
624
def test_109_renamevm (mock_warning , mock_thread , mock_input , settings_fixture ):
615
625
settings_window , page , vm_name = settings_fixture
@@ -619,29 +629,68 @@ def test_109_renamevm(mock_warning, mock_thread, mock_input, settings_fixture):
619
629
assert not settings_window .rename_vm_button .isEnabled ()
620
630
assert mock_warning .call_count == 0
621
631
return
622
- else :
623
- assert settings_window .rename_vm_button .isEnabled ()
632
+ assert settings_window .rename_vm_button .isEnabled ()
624
633
625
634
mock_input .return_value = ("renamed-vm" , True )
626
- settings_window .rename_vm_button .click ()
635
+ # Qubes with same names from mock_app may be on the system, such as
636
+ # sys-net, which affects test.
637
+ dependencies = admin_utils .vm_dependencies (settings_window .qubesapp , vm )
638
+ running_dependencies = []
639
+ running_dependencies .extend (
640
+ [
641
+ vm
642
+ for (vm , prop ) in dependencies
643
+ if vm and prop == "template" and utils .is_running (vm , False )
644
+ ]
645
+ )
646
+ for qube in running_dependencies :
647
+ expected_call = (
648
+ qube .name ,
649
+ "admin.vm.property.Get" ,
650
+ "is_preload" ,
651
+ None ,
652
+ )
653
+ assert expected_call not in settings_window .qubesapp .actual_calls
654
+ settings_window .qubesapp .expected_calls [expected_call ] = (
655
+ b"0\x00 default=False type=bool False"
656
+ )
657
+
658
+ if vm .name == "default-dvm" :
659
+ dispvm = settings_window .qubesapp .domains ["test-disp" ]
660
+ expected_call = (
661
+ dispvm .name ,
662
+ "admin.vm.property.Get" ,
663
+ "is_preload" ,
664
+ None ,
665
+ )
666
+ settings_window .qubesapp .expected_calls [expected_call ] = (
667
+ b"0\x00 default=False type=bool True"
668
+ )
669
+ assert expected_call not in settings_window .qubesapp .actual_calls
670
+ with mock .patch .object (dispvm , "is_running" , return_value = True ):
671
+ settings_window .rename_vm_button .click ()
672
+ assert expected_call in settings_window .qubesapp .actual_calls
673
+ else :
674
+ settings_window .rename_vm_button .click ()
627
675
628
676
if vm .name == "fedora-36" :
629
677
assert mock_warning .call_count == 1
630
678
assert mock_thread .call_count == 0
631
679
return
632
- elif vm .name == "test-vm-set" :
633
- mock_thread .assert_called_with (vm , "renamed-vm" , mock .ANY )
634
- mock_thread ().start .assert_called_with ()
635
- assert mock_warning .call_count == 0
636
680
637
681
assert mock_warning .call_count == 0
682
+ if vm .name in ["test-vm-set" , "default-dvm" ]:
683
+ mock_thread .assert_called_with (vm , "renamed-vm" , mock .ANY )
684
+ mock_thread ().start .assert_called_with ()
638
685
639
686
640
687
@mock .patch ("PyQt6.QtWidgets.QInputDialog.getText" )
641
688
@mock .patch ("qubesmanager.common_threads.RemoveVMThread" )
642
689
@mock .patch ("PyQt6.QtWidgets.QMessageBox.warning" )
643
690
@pytest .mark .parametrize (
644
- "settings_fixture" , ["fedora-36" , "test-vm-set" , "test-blue" ], indirect = True
691
+ "settings_fixture" ,
692
+ ["fedora-36" , "test-vm-set" , "test-blue" , "default-dvm" , "test-alt-dvm" ],
693
+ indirect = True ,
645
694
)
646
695
def test_110_deletevm (mock_warning , mock_thread , mock_input , settings_fixture ):
647
696
settings_window , page , vm_name = settings_fixture
@@ -651,22 +700,60 @@ def test_110_deletevm(mock_warning, mock_thread, mock_input, settings_fixture):
651
700
assert not settings_window .delete_vm_button .isEnabled ()
652
701
assert mock_warning .call_count == 0
653
702
return
654
- else :
655
- assert settings_window .delete_vm_button .isEnabled ()
703
+ assert settings_window .delete_vm_button .isEnabled ()
656
704
657
705
mock_input .return_value = (vm .name , True )
658
- settings_window .delete_vm_button .click ()
659
706
660
- if vm .name == "fedora-36" :
707
+ # Qubes with same names from mock_app may be on the system, such as
708
+ # sys-net, which affects test.
709
+ dependencies = [
710
+ (vm , prop )
711
+ for (vm , prop ) in admin_utils .vm_dependencies (settings_window .qubesapp , vm )
712
+ if vm
713
+ ]
714
+ for qube , prop in dependencies :
715
+ expected_call = (
716
+ qube .name ,
717
+ "admin.vm.property.Get" ,
718
+ "is_preload" ,
719
+ None ,
720
+ )
721
+ assert expected_call not in settings_window .qubesapp .actual_calls
722
+ settings_window .qubesapp .expected_calls [expected_call ] = (
723
+ b"0\x00 default=False type=bool False"
724
+ )
725
+
726
+ if vm .name in ["default-dvm" , "test-alt-dvm" ]:
727
+ if vm .name == "default-dvm" :
728
+ dispvm_name = "test-disp"
729
+ else :
730
+ dispvm_name = "test-alt-disp"
731
+ dispvm = settings_window .qubesapp .domains [dispvm_name ]
732
+ expected_call = (
733
+ dispvm .name ,
734
+ "admin.vm.property.Get" ,
735
+ "is_preload" ,
736
+ None ,
737
+ )
738
+ settings_window .qubesapp .expected_calls [expected_call ] = (
739
+ b"0\x00 default=False type=bool True"
740
+ )
741
+ assert expected_call not in settings_window .qubesapp .actual_calls
742
+ with mock .patch .object (dispvm , "is_running" , return_value = True ):
743
+ settings_window .delete_vm_button .click ()
744
+ assert expected_call in settings_window .qubesapp .actual_calls
745
+ else :
746
+ settings_window .delete_vm_button .click ()
747
+
748
+ if vm .name in ["fedora-36" , "default-dvm" ]:
661
749
assert mock_warning .call_count == 1
662
750
assert mock_thread .call_count == 0
663
751
return
664
- elif vm .name == "test-vm-set" :
665
- mock_thread .assert_called_with (vm )
666
- mock_thread ().start .assert_called_with ()
667
- assert mock_warning .call_count == 0
668
752
669
753
assert mock_warning .call_count == 0
754
+ if vm .name in ["test-vm-set" , "test-alt-dvm" ]:
755
+ mock_thread .assert_called_with (vm )
756
+ mock_thread ().start .assert_called_with ()
670
757
671
758
672
759
@mock .patch ("PyQt6.QtWidgets.QInputDialog.getText" )
0 commit comments