06cc064c8c
This is to keep the correct order of the tests. The exact dependency graph is somewhat complicated and contains several cycles.
286 lines
9.8 KiB
Python
286 lines
9.8 KiB
Python
#!/usr/bin/python2 -O
|
|
# vim: fileencoding=utf-8
|
|
# pylint: disable=protected-access,pointless-statement
|
|
|
|
#
|
|
# The Qubes OS Project, https://www.qubes-os.org/
|
|
#
|
|
# Copyright (C) 2014-2015 Joanna Rutkowska <joanna@invisiblethingslab.com>
|
|
# Copyright (C) 2014-2015 Wojtek Porczyk <woju@invisiblethingslab.com>
|
|
#
|
|
# 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, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
#
|
|
|
|
import os
|
|
import unittest
|
|
|
|
import lxml.etree
|
|
|
|
import qubes
|
|
import qubes.events
|
|
import qubes.vm
|
|
|
|
import qubes.tests
|
|
|
|
class TC_00_Label(qubes.tests.QubesTestCase):
|
|
def test_000_constructor(self):
|
|
label = qubes.Label(1, '#cc0000', 'red')
|
|
|
|
self.assertEqual(label.index, 1)
|
|
self.assertEqual(label.color, '#cc0000')
|
|
self.assertEqual(label.name, 'red')
|
|
self.assertEqual(label.icon, 'appvm-red')
|
|
self.assertEqual(label.icon_dispvm, 'dispvm-red')
|
|
|
|
def test_001_fromxml(self):
|
|
xml = lxml.etree.XML('''
|
|
<qubes version="3">
|
|
<labels>
|
|
<label id="label-1" color="#cc0000">red</label>
|
|
</labels>
|
|
</qubes>
|
|
''')
|
|
|
|
node = xml.xpath('//label')[0]
|
|
label = qubes.Label.fromxml(node)
|
|
|
|
self.assertEqual(label.index, 1)
|
|
self.assertEqual(label.color, '#cc0000')
|
|
self.assertEqual(label.name, 'red')
|
|
self.assertEqual(label.icon, 'appvm-red')
|
|
self.assertEqual(label.icon_dispvm, 'dispvm-red')
|
|
|
|
|
|
class TC_10_property(qubes.tests.QubesTestCase):
|
|
def setUp(self):
|
|
try:
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1')
|
|
except: # pylint: disable=bare-except
|
|
self.skipTest('MyTestHolder class definition failed')
|
|
self.holder = MyTestHolder(None)
|
|
|
|
def test_000_init(self):
|
|
pass
|
|
|
|
def test_001_hash(self):
|
|
hash(self.holder.__class__.testprop1)
|
|
|
|
def test_002_eq(self):
|
|
self.assertEquals(qubes.property('testprop2'),
|
|
qubes.property('testprop2'))
|
|
|
|
def test_010_set(self):
|
|
self.holder.testprop1 = 'testvalue'
|
|
self.assertEventFired(self.holder, 'property-pre-set:testprop1')
|
|
self.assertEventFired(self.holder, 'property-set:testprop1')
|
|
|
|
def test_020_get(self):
|
|
self.holder.testprop1 = 'testvalue'
|
|
self.assertEqual(self.holder.testprop1, 'testvalue')
|
|
|
|
def test_021_get_unset(self):
|
|
with self.assertRaises(AttributeError):
|
|
self.holder.testprop1
|
|
|
|
def test_022_get_default(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', default='defaultvalue')
|
|
holder = MyTestHolder(None)
|
|
|
|
self.assertEqual(holder.testprop1, 'defaultvalue')
|
|
|
|
def test_023_get_default_func(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1',
|
|
default=(lambda self: 'defaultvalue'))
|
|
holder = MyTestHolder(None)
|
|
|
|
self.assertEqual(holder.testprop1, 'defaultvalue')
|
|
holder.testprop1 = 'testvalue'
|
|
self.assertEqual(holder.testprop1, 'testvalue')
|
|
|
|
def test_030_set_setter(self):
|
|
def setter(self2, prop, value):
|
|
self.assertIs(self2, holder)
|
|
self.assertIs(prop, MyTestHolder.testprop1)
|
|
self.assertEquals(value, 'testvalue')
|
|
return 'settervalue'
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', setter=setter)
|
|
holder = MyTestHolder(None)
|
|
|
|
holder.testprop1 = 'testvalue'
|
|
self.assertEqual(holder.testprop1, 'settervalue')
|
|
|
|
def test_031_set_type(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', type=int)
|
|
holder = MyTestHolder(None)
|
|
|
|
holder.testprop1 = '5'
|
|
self.assertEqual(holder.testprop1, 5)
|
|
self.assertNotEqual(holder.testprop1, '5')
|
|
|
|
def test_080_delete(self):
|
|
self.holder.testprop1 = 'testvalue'
|
|
try:
|
|
if self.holder.testprop1 != 'testvalue':
|
|
self.skipTest('testprop1 value is wrong')
|
|
except AttributeError:
|
|
self.skipTest('testprop1 value is wrong')
|
|
|
|
del self.holder.testprop1
|
|
|
|
with self.assertRaises(AttributeError):
|
|
self.holder.testprop1
|
|
|
|
def test_081_delete_by_assign(self):
|
|
self.holder.testprop1 = 'testvalue'
|
|
try:
|
|
if self.holder.testprop1 != 'testvalue':
|
|
self.skipTest('testprop1 value is wrong')
|
|
except AttributeError:
|
|
self.skipTest('testprop1 value is wrong')
|
|
|
|
self.holder.testprop1 = qubes.property.DEFAULT
|
|
|
|
with self.assertRaises(AttributeError):
|
|
self.holder.testprop1
|
|
|
|
def test_082_delete_default(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', default='defaultvalue')
|
|
holder = MyTestHolder(None)
|
|
holder.testprop1 = 'testvalue'
|
|
|
|
try:
|
|
if holder.testprop1 != 'testvalue':
|
|
self.skipTest('testprop1 value is wrong')
|
|
except AttributeError:
|
|
self.skipTest('testprop1 value is wrong')
|
|
|
|
del holder.testprop1
|
|
|
|
self.assertEqual(holder.testprop1, 'defaultvalue')
|
|
|
|
def test_090_write_once_set(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', write_once=True)
|
|
holder = MyTestHolder(None)
|
|
|
|
holder.testprop1 = 'testvalue'
|
|
|
|
with self.assertRaises(AttributeError):
|
|
holder.testprop1 = 'testvalue2'
|
|
|
|
def test_091_write_once_delete(self):
|
|
class MyTestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', write_once=True)
|
|
holder = MyTestHolder(None)
|
|
|
|
holder.testprop1 = 'testvalue'
|
|
|
|
with self.assertRaises(AttributeError):
|
|
del holder.testprop1
|
|
|
|
|
|
class TestHolder(qubes.tests.TestEmitter, qubes.PropertyHolder):
|
|
testprop1 = qubes.property('testprop1', order=0)
|
|
testprop2 = qubes.property('testprop2', order=1, save_via_ref=True)
|
|
testprop3 = qubes.property('testprop3', order=2, default='testdefault')
|
|
testprop4 = qubes.property('testprop4', order=3)
|
|
|
|
|
|
class TC_20_PropertyHolder(qubes.tests.QubesTestCase):
|
|
def setUp(self):
|
|
xml = lxml.etree.XML('''
|
|
<qubes version="3">
|
|
<properties>
|
|
<property name="testprop1">testvalue1</property>
|
|
<property name="testprop2" ref="testref2" />
|
|
</properties>
|
|
</qubes>
|
|
''')
|
|
|
|
self.holder = TestHolder(xml)
|
|
|
|
|
|
def test_000_property_list(self):
|
|
self.assertListEqual([p.__name__ for p in self.holder.property_list()],
|
|
['testprop1', 'testprop2', 'testprop3', 'testprop4'])
|
|
|
|
def test_001_property_get_def(self):
|
|
self.assertIs(
|
|
self.holder.property_get_def('testprop1'), TestHolder.testprop1)
|
|
self.assertIs(self.holder.property_get_def(TestHolder.testprop1),
|
|
TestHolder.testprop1)
|
|
|
|
@unittest.expectedFailure
|
|
def test_002_load_properties(self):
|
|
self.holder.load_properties()
|
|
|
|
self.assertEventFired(self.holder, 'property-loaded')
|
|
self.assertEventNotFired(self.holder, 'property-set:testprop1')
|
|
|
|
self.assertEquals(self.holder.testprop1, 'testvalue1')
|
|
self.assertEquals(self.holder.testprop2, 'testref2')
|
|
self.assertEquals(self.holder.testprop3, 'testdefault')
|
|
|
|
with self.assertRaises(AttributeError):
|
|
self.holder.testprop4
|
|
|
|
def test_003_property_is_default(self):
|
|
self.holder.load_properties()
|
|
self.assertFalse(self.holder.property_is_default('testprop1'))
|
|
self.assertFalse(self.holder.property_is_default('testprop2'))
|
|
self.assertTrue(self.holder.property_is_default('testprop3'))
|
|
self.assertTrue(self.holder.property_is_default('testprop4'))
|
|
with self.assertRaises(AttributeError):
|
|
self.holder.property_is_default('testprop5')
|
|
|
|
@unittest.skip('test not implemented')
|
|
def test_004_property_init(self):
|
|
pass
|
|
|
|
@unittest.skip('test not implemented')
|
|
def test_005_clone_properties(self):
|
|
pass
|
|
|
|
def test_006_xml_properties(self):
|
|
self.holder.load_properties()
|
|
|
|
elements = self.holder.xml_properties()
|
|
elements_with_defaults = self.holder.xml_properties(with_defaults=True)
|
|
|
|
self.assertEqual(len(elements), 2)
|
|
self.assertEqual(len(elements_with_defaults), 3)
|
|
|
|
expected_prop1 = lxml.etree.Element('property', name='testprop1')
|
|
expected_prop1.text = 'testvalue1'
|
|
self.assertXMLEqual(elements_with_defaults[0], expected_prop1)
|
|
|
|
expected_prop2 = lxml.etree.Element('property',
|
|
name='testprop2', ref='testref2')
|
|
self.assertXMLEqual(elements_with_defaults[1], expected_prop2)
|
|
|
|
expected_prop3 = lxml.etree.Element('property', name='testprop3')
|
|
expected_prop3.text = 'testdefault'
|
|
self.assertXMLEqual(elements_with_defaults[2], expected_prop3)
|
|
|
|
@unittest.skip('test not implemented')
|
|
def test_010_property_require(self):
|
|
pass
|