1
0
Fork 0
tuned/tests/plugins/test_base.py
2012-10-26 17:59:29 +02:00

122 lines
4.5 KiB
Python

import unittest
import tests.globals
from flexmock import flexmock
from tuned.plugins.base import Plugin as PluginBase
import tuned.plugins.decorators
class MockPlugin(PluginBase):
@classmethod
def _get_default_options(cls):
return { 'color': 'blue', 'size': 'XXL' }
class InvalidCommandPlugin(MockPlugin):
@tuned.plugins.decorators.command_set('color')
def _set_color(self, new_color):
pass
class CommandPlugin(MockPlugin):
@classmethod
def tunable_devices(cls):
return ['a', 'b']
def _post_init(self):
self._size = 'M'
self._color = { 'a': 'green', 'b': 'pink' }
@tuned.plugins.decorators.command_set('size')
def _set_size(self, new_size):
self._size = new_size
@tuned.plugins.decorators.command_get('size')
def _get_size(self):
return self._size
@tuned.plugins.decorators.command_set('color', per_device=True)
def _set_color(self, device, new_color):
self._color[device] = new_color
@tuned.plugins.decorators.command_get('color')
def _get_color(self, device):
return self._color[device]
class PluginBaseClassTestCase(unittest.TestCase):
def setUp(self):
self.storage_factory = flexmock(create = lambda name: None)
self.monitor_repository = None
self.plugin = MockPlugin(self.monitor_repository, self.storage_factory)
def test_init(self):
self.storage_factory.should_receive('create').and_return(None).times(2)
plugin = MockPlugin(self.monitor_repository, self.storage_factory, None, None)
plugin = MockPlugin(self.monitor_repository, self.storage_factory)
def test_cleanup(self):
self.plugin.cleanup()
def test_update_tuning_not_implemented(self):
with self.assertRaises(NotImplementedError):
self.plugin.update_tuning()
def test_class_properties(self):
self.assertIs(PluginBase.tunable_devices(), None)
self.assertTrue(PluginBase.is_supported())
def test_instance_properties(self):
self.assertTrue(self.plugin.dynamic_tuning)
def test_merge_unknown_options(self):
plugin1 = PluginBase(self.monitor_repository, self.storage_factory, None, None)
plugin2 = PluginBase(self.monitor_repository, self.storage_factory, None, {})
plugin3 = PluginBase(self.monitor_repository, self.storage_factory, None, {'unknown': 'test'})
self.assertDictEqual(plugin1._options, {})
self.assertDictEqual(plugin2._options, {})
self.assertDictEqual(plugin3._options, {})
def test_merge_known_options(self):
plugin1 = MockPlugin(self.monitor_repository, self.storage_factory, None, None)
plugin2 = MockPlugin(self.monitor_repository, self.storage_factory, None, {'color': 'red'})
plugin3 = MockPlugin(self.monitor_repository, self.storage_factory, None, {'size': 'S', 'fabric': 'cotton'})
self.assertDictEqual(plugin1._options, {'size': 'XXL', 'color': 'blue'})
self.assertDictEqual(plugin2._options, {'size': 'XXL', 'color': 'red'})
self.assertDictEqual(plugin3._options, {'size': 'S', 'color': 'blue'})
def test_classs_with_invalid_commands(self):
with self.assertRaises(TypeError):
plugin = InvalidCommandPlugin(self.monitor_repository, self.storage_factory)
def test_storage_with_device_independent_commands(self):
storage = flexmock()
storage_factory = flexmock()
storage_factory.should_receive('create').and_return(storage)
storage.should_receive('set').with_args('size', 'M').once.ordered
storage.should_receive('get').with_args('size').and_return('M').once.ordered
storage.should_receive('unset').with_args('size').once.ordered
plugin = CommandPlugin(self.monitor_repository, storage_factory, ['b'], {'size': 'XXS', 'color': None})
plugin.execute_commands()
plugin.cleanup_commands()
def test_storage_with_per_device_commands(self):
storage = flexmock()
storage_factory = flexmock()
storage_factory.should_receive('create').and_return(storage)
storage.should_receive('set').with_args('color@b', 'pink').once.ordered
storage.should_receive('get').with_args('color@b').and_return('pink').once.ordered
storage.should_receive('unset').with_args('color@b').once.ordered
plugin = CommandPlugin(self.monitor_repository, storage_factory, ['b'], {'size': None, 'color': 'white'})
plugin.execute_commands()
plugin.cleanup_commands()
def test_exception_with_per_device_commands_when_no_devices_specified(self):
storage = flexmock(set=lambda key: None, get=lambda key, value: None, unset=lambda key: None)
storage_factory = flexmock()
storage_factory.should_receive('create').and_return(storage)
plugin = CommandPlugin(self.monitor_repository, storage_factory)
with self.assertRaises(TypeError):
plugin.execute_commands()
with self.assertRaises(TypeError):
plugin.cleanup_commands()