Adjust property value decoding
Now property.Get contains also explicit value type.
This commit is contained in:
parent
ade0030efe
commit
c1ae5f8bf5
@ -148,6 +148,7 @@ class PropertyHolder(object):
|
||||
return is_default
|
||||
|
||||
def __getattr__(self, item):
|
||||
# pylint: disable=too-many-return-statements
|
||||
if item.startswith('_'):
|
||||
raise AttributeError(item)
|
||||
try:
|
||||
@ -158,12 +159,35 @@ class PropertyHolder(object):
|
||||
None)
|
||||
except qubesmgmt.exc.QubesDaemonNoResponseError:
|
||||
raise qubesmgmt.exc.QubesPropertyAccessError(item)
|
||||
(_default, value) = property_str.split(b' ', 1)
|
||||
(_default, prop_type, value) = property_str.split(b' ', 2)
|
||||
prop_type = prop_type.decode('ascii')
|
||||
if not prop_type.startswith('type='):
|
||||
raise qubesmgmt.exc.QubesDaemonCommunicationError(
|
||||
'Invalid type prefix received: {}'.format(prop_type))
|
||||
(_, prop_type) = prop_type.split('=', 1)
|
||||
value = value.decode()
|
||||
if value[0] == '\'':
|
||||
return ast.literal_eval('u' + value)
|
||||
else:
|
||||
if prop_type == 'str':
|
||||
return str(value)
|
||||
elif prop_type == 'bool':
|
||||
if value == '':
|
||||
raise AttributeError
|
||||
return ast.literal_eval(value)
|
||||
elif prop_type == 'int':
|
||||
if value == '':
|
||||
raise AttributeError
|
||||
return ast.literal_eval(value)
|
||||
elif prop_type == 'vm':
|
||||
if value == '':
|
||||
return None
|
||||
return self.app.domains[value]
|
||||
elif prop_type == 'label':
|
||||
if value == '':
|
||||
return None
|
||||
# TODO
|
||||
return self.app.labels[value]
|
||||
else:
|
||||
raise qubesmgmt.exc.QubesDaemonCommunicationError(
|
||||
'Received invalid value type: {}'.format(prop_type))
|
||||
|
||||
def __setattr__(self, key, value):
|
||||
if key.startswith('_') or key in dir(self):
|
||||
|
@ -30,10 +30,10 @@ class TC_00_qubes_prefs(qubesmgmt.tests.QubesTestCase):
|
||||
b'0\x00prop1\nprop2\n'
|
||||
self.app.expected_calls[
|
||||
('dom0', 'mgmt.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=True \'value1\''
|
||||
b'0\x00default=True type=str value1'
|
||||
self.app.expected_calls[
|
||||
('dom0', 'mgmt.property.Get', 'prop2', None)] = \
|
||||
b'0\x00default=False \'value2\''
|
||||
b'0\x00default=False type=str value2'
|
||||
with qubesmgmt.tests.tools.StdoutBuffer() as stdout:
|
||||
self.assertEqual(0, qubesmgmt.tools.qubes_prefs.main([], app=self.app))
|
||||
self.assertEqual(stdout.getvalue(),
|
||||
|
@ -33,10 +33,10 @@ class TC_00_qvm_prefs(qubesmgmt.tests.QubesTestCase):
|
||||
b'0\x00prop1\nprop2\n'
|
||||
self.app.expected_calls[
|
||||
('dom0', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=True \'value1\''
|
||||
b'0\x00default=True type=str value1'
|
||||
self.app.expected_calls[
|
||||
('dom0', 'mgmt.vm.property.Get', 'prop2', None)] = \
|
||||
b'0\x00default=False \'value2\''
|
||||
b'0\x00default=False type=str value2'
|
||||
with qubesmgmt.tests.tools.StdoutBuffer() as stdout:
|
||||
self.assertEqual(0, qubesmgmt.tools.qvm_prefs.main([
|
||||
'dom0'], app=self.app))
|
||||
|
@ -35,21 +35,21 @@ class TC_00_Properties(qubesmgmt.tests.vm.VMTestCase):
|
||||
def test_001_get_str(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False \'value\''
|
||||
b'0\x00default=False type=str value'
|
||||
self.assertEqual(self.vm.prop1, 'value')
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_002_get_int(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False 123'
|
||||
b'0\x00default=False type=int 123'
|
||||
self.assertEqual(self.vm.prop1, 123)
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_003_get_bool(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False True'
|
||||
b'0\x00default=False type=bool True'
|
||||
self.assertEqual(self.vm.prop1, True)
|
||||
self.assertAllCalled()
|
||||
|
||||
@ -57,28 +57,51 @@ class TC_00_Properties(qubesmgmt.tests.vm.VMTestCase):
|
||||
self.skipTest('not specified')
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False \'test-vm\''
|
||||
b'0\x00default=False type=vm test-vm'
|
||||
self.assertEqual(self.vm.prop1, True)
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_005_get_none(self):
|
||||
def test_005_get_none_vm(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False None'
|
||||
b'0\x00default=False type=vm '
|
||||
self.assertEqual(self.vm.prop1, None)
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_006_get_none_bool(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False type=bool '
|
||||
with self.assertRaises(AttributeError):
|
||||
self.vm.prop1
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_007_get_none_int(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False type=int '
|
||||
with self.assertRaises(AttributeError):
|
||||
self.vm.prop1
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_008_get_none_str(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False type=str '
|
||||
self.assertEqual(self.vm.prop1, '')
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_010_get_default(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=False \'value\''
|
||||
b'0\x00default=False type=str value'
|
||||
self.assertEqual(self.vm.property_is_default('prop1'), False)
|
||||
self.assertAllCalled()
|
||||
|
||||
def test_011_get_default(self):
|
||||
self.app.expected_calls[
|
||||
('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \
|
||||
b'0\x00default=True \'value\''
|
||||
b'0\x00default=True type=str value'
|
||||
self.assertEqual(self.vm.property_is_default('prop1'), True)
|
||||
self.assertAllCalled()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user