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 |         return is_default | ||||||
| 
 | 
 | ||||||
|     def __getattr__(self, item): |     def __getattr__(self, item): | ||||||
|  |         # pylint: disable=too-many-return-statements | ||||||
|         if item.startswith('_'): |         if item.startswith('_'): | ||||||
|             raise AttributeError(item) |             raise AttributeError(item) | ||||||
|         try: |         try: | ||||||
| @ -158,12 +159,35 @@ class PropertyHolder(object): | |||||||
|                 None) |                 None) | ||||||
|         except qubesmgmt.exc.QubesDaemonNoResponseError: |         except qubesmgmt.exc.QubesDaemonNoResponseError: | ||||||
|             raise qubesmgmt.exc.QubesPropertyAccessError(item) |             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() |         value = value.decode() | ||||||
|         if value[0] == '\'': |         if prop_type == 'str': | ||||||
|             return ast.literal_eval('u' + value) |             return str(value) | ||||||
|         else: |         elif prop_type == 'bool': | ||||||
|  |             if value == '': | ||||||
|  |                 raise AttributeError | ||||||
|             return ast.literal_eval(value) |             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): |     def __setattr__(self, key, value): | ||||||
|         if key.startswith('_') or key in dir(self): |         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' |             b'0\x00prop1\nprop2\n' | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('dom0', 'mgmt.property.Get', 'prop1', None)] = \ |             ('dom0', 'mgmt.property.Get', 'prop1', None)] = \ | ||||||
|             b'0\x00default=True \'value1\'' |             b'0\x00default=True type=str value1' | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('dom0', 'mgmt.property.Get', 'prop2', None)] = \ |             ('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: |         with qubesmgmt.tests.tools.StdoutBuffer() as stdout: | ||||||
|             self.assertEqual(0, qubesmgmt.tools.qubes_prefs.main([], app=self.app)) |             self.assertEqual(0, qubesmgmt.tools.qubes_prefs.main([], app=self.app)) | ||||||
|         self.assertEqual(stdout.getvalue(), |         self.assertEqual(stdout.getvalue(), | ||||||
|  | |||||||
| @ -33,10 +33,10 @@ class TC_00_qvm_prefs(qubesmgmt.tests.QubesTestCase): | |||||||
|             b'0\x00prop1\nprop2\n' |             b'0\x00prop1\nprop2\n' | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('dom0', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('dom0', 'mgmt.vm.property.Get', 'prop1', None)] = \ | ||||||
|             b'0\x00default=True \'value1\'' |             b'0\x00default=True type=str value1' | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('dom0', 'mgmt.vm.property.Get', 'prop2', None)] = \ |             ('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: |         with qubesmgmt.tests.tools.StdoutBuffer() as stdout: | ||||||
|             self.assertEqual(0, qubesmgmt.tools.qvm_prefs.main([ |             self.assertEqual(0, qubesmgmt.tools.qvm_prefs.main([ | ||||||
|                 'dom0'], app=self.app)) |                 'dom0'], app=self.app)) | ||||||
|  | |||||||
| @ -35,21 +35,21 @@ class TC_00_Properties(qubesmgmt.tests.vm.VMTestCase): | |||||||
|     def test_001_get_str(self): |     def test_001_get_str(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.prop1, 'value') | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
|     def test_002_get_int(self): |     def test_002_get_int(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.prop1, 123) | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
|     def test_003_get_bool(self): |     def test_003_get_bool(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.prop1, True) | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
| @ -57,28 +57,51 @@ class TC_00_Properties(qubesmgmt.tests.vm.VMTestCase): | |||||||
|         self.skipTest('not specified') |         self.skipTest('not specified') | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.prop1, True) | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
|     def test_005_get_none(self): |     def test_005_get_none_vm(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.prop1, None) | ||||||
|         self.assertAllCalled() |         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): |     def test_010_get_default(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.property_is_default('prop1'), False) | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
|     def test_011_get_default(self): |     def test_011_get_default(self): | ||||||
|         self.app.expected_calls[ |         self.app.expected_calls[ | ||||||
|             ('test-vm', 'mgmt.vm.property.Get', 'prop1', None)] = \ |             ('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.assertEqual(self.vm.property_is_default('prop1'), True) | ||||||
|         self.assertAllCalled() |         self.assertAllCalled() | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki