Tests for Create New VM

This commit is contained in:
Marta Marczykowska-Górecka 2019-05-12 19:45:06 +02:00
parent d4965c5b27
commit d92c782ec9
No known key found for this signature in database
GPG Key ID: 9A752C30B26FD04B
2 changed files with 241 additions and 6 deletions

View File

@ -23,6 +23,7 @@ import logging.handlers
import sys import sys
import unittest import unittest
import unittest.mock import unittest.mock
import qubesadmin
from PyQt4 import QtGui, QtTest, QtCore from PyQt4 import QtGui, QtTest, QtCore
from qubesadmin import Qubes, events, utils, exc from qubesadmin import Qubes, events, utils, exc
@ -34,23 +35,255 @@ class NewVmTest(unittest.TestCase):
super(NewVmTest, self).setUp() super(NewVmTest, self).setUp()
self.qapp = Qubes() self.qapp = Qubes()
self.qtapp = QtGui.QApplication(sys.argv) self.qtapp = QtGui.QApplication(["test", "-style", "cleanlooks"])
self.dispatcher = events.EventsDispatcher(self.qapp)
# mock up the Create VM Thread to avoid changing system state
self.patcher_thread = unittest.mock.patch(
'qubesmanager.create_new_vm.CreateVMThread')
self.mock_thread = self.patcher_thread.start()
self.addCleanup(self.patcher_thread.stop)
# mock the progress dialog to speed testing up
self.patcher_progress = unittest.mock.patch(
'PyQt4.QtGui.QProgressDialog')
self.mock_progress = self.patcher_progress.start()
self.addCleanup(self.patcher_progress.stop)
self.dialog = create_new_vm.NewVmDlg( self.dialog = create_new_vm.NewVmDlg(
self.qtapp, self.qapp) self.qtapp, self.qapp)
def tearDown(self): def tearDown(self):
self.dialog.deleteLater() self.dialog.deleteLater()
self.qtapp.deleteLater()
self.qtapp.processEvents()
super(NewVmTest, self).tearDown() super(NewVmTest, self).tearDown()
def test_00_window_loads(self): def test_00_window_loads(self):
self.assertTrue(self.dialog.select_vms_widget is not None) self.assertGreater(self.dialog.template_vm.count(), 0,
"No templates shown")
self.assertGreater(self.dialog.netvm.count(), 0, "No netvm listed")
def test_01_vms_load_correctly(self): def test_01_cancel_works(self):
pass self.__click_cancel()
self.assertEqual(self.mock_thread.call_count, 0,
"Attempted to create VM on cancel")
class CreatteVMThreadTest(unittest.TestCase): def test_02_create_simple_vm(self):
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, qubesadmin.DEFAULT,
{'provides_network': False})
self.mock_thread().start.assert_called_once_with()
def test_03_label(self):
for i in range(self.dialog.label.count()):
if self.dialog.label.itemText(i) == 'blue':
self.dialog.label.setCurrentIndex(i)
break
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
self.qapp.labels['blue'], qubesadmin.DEFAULT,
unittest.mock.ANY)
self.mock_thread().start.assert_called_once_with()
def test_04_template(self):
template = None
for i in range(self.dialog.template_vm.count()):
if not self.dialog.template_vm.itemText(i).startswith('default'):
self.dialog.template_vm.setCurrentIndex(i)
template = self.dialog.template_vm.currentText()
break
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, template,
unittest.mock.ANY)
def test_05_netvm(self):
netvm = None
for i in range(self.dialog.netvm.count()):
if not self.dialog.netvm.itemText(i).startswith('default'):
self.dialog.netvm.setCurrentIndex(i)
netvm = self.dialog.netvm.currentText()
break
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, unittest.mock.ANY,
{'netvm': netvm, 'provides_network': False})
def test_06_provides_network(self):
self.dialog.provides_network.setChecked(True)
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, unittest.mock.ANY,
{'provides_network': True})
@unittest.mock.patch('subprocess.check_call')
def test_07_launch_settings(self, mock_call):
self.dialog.launch_settings.setChecked(True)
self.dialog.name.setText("testvm")
self.__click_ok()
# make sure the thread is not reporting an error
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, unittest.mock.ANY,
unittest.mock.ANY)
self.mock_thread().msg = None
self.dialog.create_finished()
mock_call.assert_called_once_with(['qubes-vm-settings', "testvm"])
def test_08_progress_hides(self):
self.dialog.name.setText("testvm")
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "AppVM", "testvm",
unittest.mock.ANY, unittest.mock.ANY,
unittest.mock.ANY)
# make sure the thread is not reporting an error
self.mock_thread().start.assert_called_once_with()
self.mock_thread().msg = None
self.mock_progress().show.assert_called_once_with()
self.dialog.create_finished()
self.mock_progress().hide.assert_called_once_with()
def test_09_standalone_clone(self):
self.dialog.name.setText("testvm")
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "standalone" in opt_text and "template" in opt_text and\
"not based" not in opt_text and "empty" not in opt_text:
self.dialog.vm_type.setCurrentIndex(i)
break
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "StandaloneVM", "testvm",
unittest.mock.ANY, unittest.mock.ANY,
unittest.mock.ANY)
@unittest.mock.patch('subprocess.check_call')
def test_10_standalone_empty(self, mock_call):
self.dialog.name.setText("testvm")
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "standalone" in opt_text and\
("not based" in opt_text or "empty" in opt_text):
self.dialog.vm_type.setCurrentIndex(i)
break
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "StandaloneVM", "testvm",
unittest.mock.ANY, None,
unittest.mock.ANY)
self.mock_thread().msg = None
self.dialog.create_finished()
mock_call.assert_called_once_with(['qubes-vm-boot-from-device',
'testvm'])
@unittest.mock.patch('subprocess.check_call')
def test_11_standalone_empty_not_install(self, mock_call):
self.dialog.name.setText("testvm")
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "standalone" in opt_text and\
("not based" in opt_text or "empty" in opt_text):
self.dialog.vm_type.setCurrentIndex(i)
break
self.dialog.install_system.setChecked(False)
self.__click_ok()
self.mock_thread.assert_called_once_with(
self.qapp, "StandaloneVM", "testvm",
unittest.mock.ANY, None,
unittest.mock.ANY)
self.mock_thread().msg = None
self.dialog.create_finished()
self.assertEqual(mock_call.call_count, 0)
def test_12_setting_change(self):
# cannot install system on a template-based appvm
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "appvm" in opt_text and "standalone" not in opt_text:
self.dialog.vm_type.setCurrentIndex(i)
break
self.assertFalse(self.dialog.install_system.isEnabled())
self.assertTrue(self.dialog.launch_settings.isEnabled())
self.assertTrue(self.dialog.template_vm.isEnabled())
# or on a standalone vm cloned from a template
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "standalone" in opt_text and "template" in opt_text and\
"not based" not in opt_text and "empty" not in opt_text:
self.dialog.vm_type.setCurrentIndex(i)
break
self.assertFalse(self.dialog.install_system.isEnabled())
self.assertTrue(self.dialog.launch_settings.isEnabled())
self.assertTrue(self.dialog.template_vm.isEnabled())
# cannot set a template but can install system on a truly empty AppVM
for i in range(self.dialog.vm_type.count()):
opt_text = self.dialog.vm_type.itemText(i).lower()
if "standalone" in opt_text and\
("not based" in opt_text or "empty" in opt_text):
self.dialog.vm_type.setCurrentIndex(i)
break
self.assertTrue(self.dialog.install_system.isEnabled())
self.assertTrue(self.dialog.launch_settings.isEnabled())
self.assertFalse(self.dialog.template_vm.isEnabled())
def __click_ok(self):
okwidget = self.dialog.buttonBox.button(
self.dialog.buttonBox.Ok)
QtTest.QTest.mouseClick(okwidget, QtCore.Qt.LeftButton)
def __click_cancel(self):
cancelwidget = self.dialog.buttonBox.button(
self.dialog.buttonBox.Cancel)
QtTest.QTest.mouseClick(cancelwidget, QtCore.Qt.LeftButton)
# class CreatteVMThreadTest(unittest.TestCase):
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -127,6 +127,8 @@ rm -rf $RPM_BUILD_ROOT
%{python3_sitelib}/qubesmanager/tests/test_backup_utils.py %{python3_sitelib}/qubesmanager/tests/test_backup_utils.py
%{python3_sitelib}/qubesmanager/tests/test_global_settings.py %{python3_sitelib}/qubesmanager/tests/test_global_settings.py
%{python3_sitelib}/qubesmanager/tests/test_qube_manager.py %{python3_sitelib}/qubesmanager/tests/test_qube_manager.py
%{python3_sitelib}/qubesmanager/tests/test_create_new_vm.py
%{python3_sitelib}/qubesmanager/tests/test_vm_settings.py
%dir %{python3_sitelib}/qubesmanager-*.egg-info %dir %{python3_sitelib}/qubesmanager-*.egg-info
%{python3_sitelib}/qubesmanager-*.egg-info/* %{python3_sitelib}/qubesmanager-*.egg-info/*