Skip to content

Commit

Permalink
tests: basic tests for AppVM
Browse files Browse the repository at this point in the history
Specifically, check if root volume is updated after template switch.
  • Loading branch information
marmarek committed Jun 6, 2017
1 parent 89e025c commit 67fcda2
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 0 deletions.
1 change: 1 addition & 0 deletions qubes/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,7 @@ def load_tests(loader, tests, pattern): # pylint: disable=unused-argument
'qubes.tests.vm.qubesvm',
'qubes.tests.vm.mix.net',
'qubes.tests.vm.adminvm',
'qubes.tests.vm.appvm',
'qubes.tests.app',
'qubes.tests.tarwriter',
'qubes.tests.api_admin',
Expand Down
4 changes: 4 additions & 0 deletions qubes/tests/vm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,12 @@ def get_label(self, label):
return l
raise KeyError(label)

def get_pool(self, pool):
return self.pools[pool]

def __init__(self):
super(TestApp, self).__init__()
self.vmm = TestVMM()
self.host = TestHost()
self.pools = {}
self.domains = {}
113 changes: 113 additions & 0 deletions qubes/tests/vm/appvm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# -*- encoding: utf8 -*-
#
# The Qubes OS Project, http://www.qubes-os.org
#
# Copyright (C) 2017 Marek Marczykowski-Górecki
# <[email protected]>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, see <http://www.gnu.org/licenses/>.

from unittest import mock

import qubes.tests
import qubes.tests.vm.qubesvm
import qubes.vm.appvm
import qubes.vm.templatevm

class TestApp(object):
labels = {1: qubes.Label(1, '0xcc0000', 'red')}

def __init__(self):
self.domains = {}

class TestProp(object):
# pylint: disable=too-few-public-methods
__name__ = 'testprop'

class TestVM(object):
# pylint: disable=too-few-public-methods
app = TestApp()

def __init__(self, **kwargs):
self.running = False
self.installed_by_rpm = False
for k, v in kwargs.items():
setattr(self, k, v)

def is_running(self):
return self.running

class TC_90_AppVM(qubes.tests.vm.qubesvm.QubesVMTestsMixin,
qubes.tests.QubesTestCase):
def setUp(self):
super().setUp()
self.app.pools['default'] = mock.Mock(**{
'init_volume.return_value.pool': 'default'})
self.app.pools['linux-kernel'] = mock.Mock(**{
'init_volume.return_value.pool': 'linux-kernel'})
self.template = qubes.vm.templatevm.TemplateVM(self.app, None,
qid=1, name=qubes.tests.VMPREFIX + 'template')
self.app.domains[self.template.name] = self.template
self.app.domains[self.template] = self.template

def get_vm(self, **kwargs):
return qubes.vm.appvm.AppVM(self.app, None,
qid=2, name=qubes.tests.VMPREFIX + 'test',
template=self.template,
**kwargs)

def test_000_init(self):
self.get_vm()

def test_001_storage_init(self):
vm = self.get_vm()
self.assertTrue(vm.volume_config['private']['save_on_stop'])
self.assertFalse(vm.volume_config['private']['snap_on_start'])
self.assertIsNone(vm.volume_config['private'].get('source', None))

self.assertFalse(vm.volume_config['root']['save_on_stop'])
self.assertTrue(vm.volume_config['root']['snap_on_start'])
self.assertEqual(vm.volume_config['root'].get('source', None),
self.template.volumes['root'].source)

self.assertFalse(
vm.volume_config['volatile'].get('save_on_stop', False))
self.assertFalse(
vm.volume_config['volatile'].get('snap_on_start', False))
self.assertIsNone(vm.volume_config['volatile'].get('source', None))

def test_002_storage_template_change(self):
vm = self.get_vm()
# create new mock, so new template will get different volumes
self.app.pools['default'] = mock.Mock(**{
'init_volume.return_value.pool': 'default'})
template2 = qubes.vm.templatevm.TemplateVM(self.app, None,
qid=3, name=qubes.tests.VMPREFIX + 'template2')
self.app.domains[template2.name] = template2
self.app.domains[template2] = template2

vm.template = template2
self.assertFalse(vm.volume_config['root']['save_on_stop'])
self.assertTrue(vm.volume_config['root']['snap_on_start'])
self.assertNotEqual(vm.volume_config['root'].get('source', None),
self.template.volumes['root'].source)
self.assertEqual(vm.volume_config['root'].get('source', None),
template2.volumes['root'].source)

def test_003_template_change_running(self):
vm = self.get_vm()
with mock.patch.object(vm, 'get_power_state') as mock_power:
mock_power.return_value = 'Running'
with self.assertRaises(qubes.exc.QubesVMNotHaltedError):
vm.template = self.template
1 change: 1 addition & 0 deletions rpm_spec/core-dom0.spec
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@ fi
%{python3_sitelib}/qubes/tests/vm/__init__.py
%{python3_sitelib}/qubes/tests/vm/init.py
%{python3_sitelib}/qubes/tests/vm/adminvm.py
%{python3_sitelib}/qubes/tests/vm/appvm.py
%{python3_sitelib}/qubes/tests/vm/qubesvm.py

%dir %{python3_sitelib}/qubes/tests/vm/mix
Expand Down

0 comments on commit 67fcda2

Please sign in to comment.